home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu036.dms / pu036.adf / BasLib.asm < prev    next >
Assembly Source File  |  1990-06-29  |  112KB  |  6,031 lines

  1.  
  2. ;
  3. ; Cursor V1.0
  4. ; (c) 1990 by Jürgen Forster
  5. ;
  6.  
  7. ; die Register D0-D7 und A0-A3 sind jederzeit von Funktionen, die
  8. ;  ihre Parameter über den Stack bekommen, verfügbar.
  9. ; A4 zeigt auf eine lokale Variablentabelle
  10. ; A5 zeigt auf die Tabelle der globalen Variablen und konstanten Strings
  11. ; A6 zeigt auf die BASBASE-Struktur, muß gerettet werden!
  12.  
  13. VERSION EQU 1
  14. REVISION EQU 270
  15.  
  16.  NOLIST
  17.  INCLUDE exec/types.i
  18.  INCLUDE exec/initializers.i
  19.  INCLUDE exec/io.i
  20.  INCLUDE exec/libraries.i
  21.  INCLUDE exec/lists.i
  22.  INCLUDE exec/resident.i
  23.  INCLUDE exec/strings.i
  24.  INCLUDE exec/memory.i
  25.  INCLUDE exec/execbase.i
  26.  INCLUDE exec/tasks.i
  27.  INCLUDE libraries/dos.i
  28.  INCLUDE libraries/dosextens.i
  29.  INCLUDE intuition/intuition.i
  30.  INCLUDE devices/inputevent.i
  31.  INCLUDE devices/conunit.i
  32.  INCLUDE offsets.i
  33.  INCLUDE libmacros.i
  34.  LIST
  35.  
  36.  XREF _CreatePort
  37.  XREF _DeletePort
  38.  XREF _CreateStdIO
  39.  XREF _DeleteStdIO
  40.  
  41. ; **********************************************************************
  42. ; *                                                                    *
  43. ; * Unterstützung der Library                                          *
  44. ; *                                                                    *
  45. ; **********************************************************************
  46.  
  47.  STRUCTURE BASBASE,LIB_SIZE
  48.  BPTR BASBASE_SEGLIST
  49.  LABEL BASBASE_SIZEOF
  50.  
  51.  moveq #RETURN_FAIL,d0
  52.  rts
  53.  
  54. ROMTag
  55.  dc.w RTC_MATCHWORD
  56.  dc.l ROMTag
  57.  dc.l EndCode
  58.  dc.b RTF_AUTOINIT
  59.  dc.b VERSION
  60.  dc.b NT_LIBRARY
  61.  dc.b 0
  62.  dc.l bas_runtimeName
  63.  dc.l idString
  64.  dc.l Init
  65.  
  66. bas_runtimeName
  67.  dc.b 'bas_runtime.library',0
  68. idString
  69.  dc.b 'bas_runtime.library 1.0 (30 Mar 1990) (c) 1990 Jürgen Forster',CR,LF,0
  70.  even
  71.  
  72. Init
  73.  dc.l BASBASE_SIZEOF
  74.  dc.l functable
  75.  dc.l datatable
  76.  dc.l InitLib
  77.  
  78. functable
  79.  dc.l OpenLib
  80.  dc.l CloseLib
  81.  dc.l ExpungeLib
  82.  dc.l ExtFuncLib
  83.  dc.l INIT__
  84.  dc.l END__
  85.  dc.l ABS_D_D
  86.  dc.l ABS_I_I
  87.  dc.l ABS_L_L
  88.  dc.l ABS_R_R
  89.  dc.l ADD_DD_D
  90.  dc.l ADD_II_I
  91.  dc.l ADD_LL_L
  92.  dc.l ADD_RR_R
  93.  dc.l ADD_TT_T
  94.  dc.l AND_II_I
  95.  dc.l AND_LL_L
  96.  dc.l AREAFILL_I_
  97.  dc.l AREAFILL__
  98.  dc.l AREA_II_
  99.  dc.l ASC_T_I
  100.  dc.l ATN_D_D
  101.  dc.l ATN_R_R
  102.  dc.l BEEP__
  103.  dc.l BREAKOFF__
  104.  dc.l BREAKON__
  105.  dc.l BREAKSTOP__
  106.  dc.l CALL_Z_
  107.  dc.l CHDIR_T_
  108.  dc.l CHECKINPUTEND__
  109.  dc.l CHR_I_T
  110.  dc.l CIRCLE_IIIIRRR_
  111.  dc.l CIRCLE_IIIIRR_
  112.  dc.l CIRCLE_IIII_
  113.  dc.l CIRCLE_III_
  114.  dc.l CLEAR__
  115.  dc.l CLOSE_I_
  116.  dc.l CLOSE__
  117.  dc.l CLS__
  118.  dc.l COLLISIONOFF__
  119.  dc.l COLLISIONON__
  120.  dc.l COLLISIONSTOP__
  121.  dc.l COLLISION_I_I
  122.  dc.l COLOR1_I_
  123.  dc.l COLOR2_I_
  124.  dc.l CONVERT_D_I
  125.  dc.l CONVERT_D_L
  126.  dc.l CONVERT_D_R
  127.  dc.l CONVERT_I_D
  128.  dc.l CONVERT_I_L
  129.  dc.l CONVERT_I_R
  130.  dc.l CONVERT_L_D
  131.  dc.l CONVERT_L_I
  132.  dc.l CONVERT_L_R
  133.  dc.l CONVERT_R_D
  134.  dc.l CONVERT_R_I
  135.  dc.l CONVERT_R_L
  136.  dc.l COS_D_D
  137.  dc.l COS_R_R
  138.  dc.l CSRLIN__I
  139.  dc.l CVD_T_D
  140.  dc.l CVI_T_I
  141.  dc.l CVL_T_L
  142.  dc.l CVL_T_R
  143.  dc.l DATE__T
  144.  dc.l DIMDOUB_FP_
  145.  dc.l DIMINT_FP_
  146.  dc.l DIMLONG_FP_
  147.  dc.l DIMREAL_FP_
  148.  dc.l DIMTEXT_FP_
  149.  dc.l DIMSHAREDDOUB_FP_
  150.  dc.l DIMSHAREDINT_FP_
  151.  dc.l DIMSHAREDLONG_FP_
  152.  dc.l DIMSHAREDREAL_FP_
  153.  dc.l DIMSHAREDTEXT_FP_
  154.  dc.l DIV_DD_D
  155.  dc.l DIV_II_I
  156.  dc.l DIV_LL_L
  157.  dc.l DIV_RR_R
  158.  dc.l DOUBLE_D_DD
  159.  dc.l DOUBLE_I_II
  160.  dc.l DOUBLE_L_LL
  161.  dc.l DOUBLE_R_RR
  162.  dc.l DOUBLE_T_TT
  163.  dc.l ENDSUB__
  164.  dc.l EOF_I_I
  165.  dc.l EQV_II_I
  166.  dc.l EQV_LL_L
  167.  dc.l EQ_DD_D
  168.  dc.l EQ_II_I
  169.  dc.l EQ_LL_I
  170.  dc.l EQ_RR_R
  171.  dc.l EQ_TT_I
  172.  dc.l ERASE_f_
  173.  dc.l ERL__I
  174.  dc.l ERROR_L_
  175.  dc.l ERR__I
  176.  dc.l EXP_D_D
  177.  dc.l EXP_R_R
  178.  dc.l FILEINPUT_I_IT
  179.  dc.l FILELINEINPUT_I_T
  180.  dc.l FILEPRINTRETURN_I_I
  181.  dc.l FILEPRINTTAB_I_I
  182.  dc.l FILEPRINT_ID_I
  183.  dc.l FILEPRINT_II_I
  184.  dc.l FILEPRINT_IL_I
  185.  dc.l FILEPRINT_IR_I
  186.  dc.l FILEPRINT_IT_I
  187.  dc.l FILES_T_
  188.  dc.l FILES__
  189.  dc.l FIX_D_D
  190.  dc.l FIX_R_R
  191.  dc.l FORGET_D_
  192.  dc.l FORGET_I_
  193.  dc.l FORGET_L_
  194.  dc.l FORGET_R_
  195.  dc.l FORGET_T_
  196.  dc.l FRE_I_L
  197.  dc.l FRONTCOLOR__I
  198.  dc.l GETCOLOR0__I
  199.  dc.l GETDOUBELEMPOINTER_FP_L
  200.  dc.l GETDOUBELEM_FP_D
  201.  dc.l GETINPUTPART__T
  202.  dc.l GETINTELEMPOINTER_FP_L
  203.  dc.l GETINTELEM_FP_I
  204.  dc.l GETLONGELEMPOINTER_FP_L
  205.  dc.l GETLONGELEM_FP_L
  206.  dc.l GETREALELEMPOINTER_FP_L
  207.  dc.l GETREALELEM_FP_R
  208.  dc.l GETTEXTELEMPOINTER_FP_L
  209.  dc.l GETTEXTELEM_FP_T
  210.  dc.l GETWINDOWSIZE__II
  211.  dc.l GE_DD_D
  212.  dc.l GE_II_I
  213.  dc.l GE_LL_I
  214.  dc.l GE_RR_R
  215.  dc.l GE_TT_I
  216.  dc.l GFXSTEP_II_II
  217.  dc.l GOSUB_Z_
  218.  dc.l GOTO_Z_
  219.  dc.l GT_DD_D
  220.  dc.l GT_II_I
  221.  dc.l GT_LL_I
  222.  dc.l GT_RR_R
  223.  dc.l GT_TT_I
  224.  dc.l HEX_L_T
  225.  dc.l IF_IDD_D
  226.  dc.l IF_III_I
  227.  dc.l IF_ILL_L
  228.  dc.l IF_IRR_R
  229.  dc.l IF_ITT_T
  230.  dc.l IF_IZ_
  231.  dc.l IMP_II_I
  232.  dc.l IMP_LL_L
  233.  dc.l INKEY__T
  234.  dc.l INPUT_II_T
  235.  dc.l INPUT__
  236.  dc.l INSTR_ITT_I
  237.  dc.l INSTR_TT_I
  238.  dc.l INT_D_D
  239.  dc.l INT_R_R
  240.  dc.l KILL_T_
  241.  dc.l LEFT_TI_T
  242.  dc.l LEN_T_I
  243.  dc.l LE_DD_D
  244.  dc.l LE_II_I
  245.  dc.l LE_LL_I
  246.  dc.l LE_RR_R
  247.  dc.l LE_TT_I
  248.  dc.l LIBRARYCLOSE__
  249.  dc.l LIBRARY_T_
  250.  dc.l LINEBF_IIIII_
  251.  dc.l LINEB_IIIII_
  252.  dc.l LINEINPUT__T
  253.  dc.l LINE_IIIII_
  254.  dc.l LOCATEX_I_
  255.  dc.l LOCATEY_I_
  256.  dc.l LOC_I_L
  257.  dc.l LOF_I_L
  258.  dc.l LOG_D_D
  259.  dc.l LOG_R_R
  260.  dc.l LPOS_I_I
  261.  dc.l LPRINTRETURN__
  262.  dc.l LPRINTTAB__
  263.  dc.l LPRINT_D_
  264.  dc.l LPRINT_I_
  265.  dc.l LPRINT_L_
  266.  dc.l LPRINT_R_
  267.  dc.l LPRINT_T_
  268.  dc.l LT_DD_D
  269.  dc.l LT_II_I
  270.  dc.l LT_LL_I
  271.  dc.l LT_RR_R
  272.  dc.l LT_TT_I
  273.  dc.l MENUOFF__
  274.  dc.l MENUON__
  275.  dc.l MENURESET__
  276.  dc.l MENUSTOP__
  277.  dc.l MENU_IIIT_
  278.  dc.l MENU_III_
  279.  dc.l MENU_I_I
  280.  dc.l MID_TII_T
  281.  dc.l MID_TI_T
  282.  dc.l MKD_D_T
  283.  dc.l MKI_I_T
  284.  dc.l MKL_L_T
  285.  dc.l MKS_R_T
  286.  dc.l MOD_II_I
  287.  dc.l MOD_LL_L
  288.  dc.l MOUSEOFF__
  289.  dc.l MOUSEON__
  290.  dc.l MOUSESTOP__
  291.  dc.l MOUSE_I_I
  292.  dc.l MUL_DD_D
  293.  dc.l MUL_II_L
  294.  dc.l MUL_LL_L
  295.  dc.l MUL_RR_R
  296.  dc.l NAME_TT_
  297.  dc.l NEG_D_D
  298.  dc.l NEG_I_I
  299.  dc.l NEG_L_L
  300.  dc.l NEG_R_R
  301.  dc.l NEXT_DDDZ_
  302.  dc.l NEXT_IIIZ_
  303.  dc.l NEXT_LLLZ_
  304.  dc.l NEXT_RRRZ_
  305.  dc.l NE_DD_D
  306.  dc.l NE_II_I
  307.  dc.l NE_LL_I
  308.  dc.l NE_RR_R
  309.  dc.l NE_TT_I
  310.  dc.l NOT_I_I
  311.  dc.l NOT_L_L
  312.  dc.l OBJECT.AX_II_
  313.  dc.l OBJECT.AY_II_
  314.  dc.l OBJECT.CLIP_IIII_
  315.  dc.l OBJECT.CLOSE_I_
  316.  dc.l OBJECT.CLOSE__
  317.  dc.l OBJECT.HIT1_II_I
  318.  dc.l OBJECT.HIT2_II_I
  319.  dc.l OBJECT.OFF_I_
  320.  dc.l OBJECT.OFF__
  321.  dc.l OBJECT.ON_I_
  322.  dc.l OBJECT.ON__
  323.  dc.l OBJECT.PLANES1_II_I
  324.  dc.l OBJECT.PLANES2_II_I
  325.  dc.l OBJECT.PRIORITY_II_
  326.  dc.l OBJECT.SHAPE_II_
  327.  dc.l OBJECT.SHAPE_IT_
  328.  dc.l OBJECT.START_I_
  329.  dc.l OBJECT.START__
  330.  dc.l OBJECT.STOP_I_
  331.  dc.l OBJECT.STOP__
  332.  dc.l OBJECT.VX_II_
  333.  dc.l OBJECT.VX_I_I
  334.  dc.l OBJECT.VY_II_
  335.  dc.l OBJECT.VY_I_I
  336.  dc.l OBJECT.X_II_
  337.  dc.l OBJECT.Y_II_
  338.  dc.l OCT_L_T
  339.  dc.l ONBREAKGOSUB_Z_
  340.  dc.l ONCOLLISIONGOSUB_Z_
  341.  dc.l ONERRORGOTO_Z_
  342.  dc.l ONGOSUB_IIZ_II
  343.  dc.l ONGOTO_IIZ_II
  344.  dc.l ONMENUGOSUB_Z_
  345.  dc.l ONMOUSEGOSUB_Z_
  346.  dc.l ONTIMERGOSUB_IZ_
  347.  dc.l OPENAPPEND_TI_
  348.  dc.l OPENINPUT_TI_
  349.  dc.l OPENOUTPUT_TI_
  350.  dc.l OPENREADWRITE_TI_
  351.  dc.l OR_II_I
  352.  dc.l OR_LL_L
  353.  dc.l PAINT_IIII_
  354.  dc.l PALETTE_IRRR_
  355.  dc.l PATTERN1_L_
  356.  dc.l PATTERN2_L_
  357.  dc.l PEEKL_L_L
  358.  dc.l PEEKW_L_I
  359.  dc.l PEEK_L_I
  360.  dc.l POINT_II_I
  361.  dc.l POKEL_LL_
  362.  dc.l POKEW_LI_
  363.  dc.l POKE_LI_
  364.  dc.l POS_I_I
  365.  dc.l POT_DD_D
  366.  dc.l POT_RR_R
  367.  dc.l PRESET_III_
  368.  dc.l PRINTQMARK__
  369.  dc.l PRINTRETURN__
  370.  dc.l PRINTTAB__
  371.  dc.l PRINT_D_
  372.  dc.l PRINT_I_
  373.  dc.l PRINT_L_
  374.  dc.l PRINT_R_
  375.  dc.l PRINT_T_
  376.  dc.l PSET_III_
  377.  dc.l RANDOMIZE_I_
  378.  dc.l RANDOMIZE__
  379.  dc.l READ__T
  380.  dc.l RESTORE_I_
  381.  dc.l RESTORE__
  382.  dc.l RESUMENEXT__
  383.  dc.l RESUME_Z_
  384.  dc.l RESUME__
  385.  dc.l RETURN_Z_
  386.  dc.l RETURN__
  387.  dc.l RIGHT_TI_T
  388.  dc.l RND_I_R
  389.  dc.l RND__R
  390.  dc.l RUN_Z_
  391.  dc.l RUN__
  392.  dc.l SADD_T_L
  393.  dc.l SCREENCLOSE_I_
  394.  dc.l SCREEN_IIIII_
  395.  dc.l SCROLL_IIIIII_
  396.  dc.l SETDOUBELEM_DFP_
  397.  dc.l SETINTELEM_IFP_
  398.  dc.l SETLINE_L_
  399.  dc.l SETLONGELEM_LFP_
  400.  dc.l SETMEM_L_
  401.  dc.l SETMID_tIIT_
  402.  dc.l SETMID_tIT_
  403.  dc.l SETREALELEM_RFP_
  404.  dc.l SETSTACK_L_
  405.  dc.l SETTEXTELEM_TFP_
  406.  dc.l SGN_D_I
  407.  dc.l SGN_I_I
  408.  dc.l SGN_L_I
  409.  dc.l SGN_R_I
  410.  dc.l SIN_D_D
  411.  dc.l SIN_R_R
  412.  dc.l SLEEP__
  413.  dc.l SOUNDRESUME__
  414.  dc.l SOUNDWAIT__
  415.  dc.l SOUND_IIII_
  416.  dc.l SPACE_I_T
  417.  dc.l SQR_D_D
  418.  dc.l SQR_L_I      ; Nicht mehr benutzt
  419.  dc.l SQR_R_R
  420.  dc.l STICK_I_I
  421.  dc.l STRIG_I_I
  422.  dc.l STRING_II_T
  423.  dc.l STRING_IT_T
  424.  dc.l STR_D_T
  425.  dc.l STR_I_T
  426.  dc.l STR_L_T
  427.  dc.l STR_R_T
  428.  dc.l SUB_DD_D
  429.  dc.l SUB_II_
  430.  dc.l SUB_II_I
  431.  dc.l SUB_LL_L
  432.  dc.l SUB_RR_R
  433.  dc.l SWAP_dd_
  434.  dc.l SWAP_ii_
  435.  dc.l SWAP_ll_
  436.  dc.l SWAP_rr_
  437.  dc.l SWAP_tt_
  438.  dc.l SYSTEM__
  439.  dc.l TAN_D_D
  440.  dc.l TAN_R_R
  441.  dc.l TIMEROFF__
  442.  dc.l TIMERON__
  443.  dc.l TIMERSTOP__
  444.  dc.l TIMER__L
  445.  dc.l TIME__T
  446.  dc.l TRANSLATE_T_T
  447.  dc.l TROFF__
  448.  dc.l TRON__
  449.  dc.l UCASE_T_T
  450.  dc.l VAL_T_D
  451.  dc.l WINDOWCLOSE_I_
  452.  dc.l WINDOWOUTPUT_I_
  453.  dc.l WINDOW_ITIIIIII_
  454.  dc.l WINDOW_I_L
  455.  dc.l XOR_II_I
  456.  dc.l XOR_LL_L
  457.  dc.l -1
  458.  
  459. datatable
  460.  INITBYTE LH_TYPE,NT_LIBRARY
  461.  INITLONG LN_NAME,bas_runtimeName
  462.  INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  463.  INITWORD LIB_VERSION,VERSION
  464.  INITWORD LIB_REVISION,REVISION
  465.  INITLONG LIB_IDSTRING,idString
  466.  dc.l 0
  467.  
  468. InitLib
  469.  move.l a5,-(sp)
  470.  move.l d0,a5
  471.  move.l a0,BASBASE_SEGLIST(a5)
  472.  move.l (sp)+,a5
  473.  rts
  474.  
  475. OpenLib
  476.  addq.w #1,LIB_OPENCNT(a6)
  477.  bclr #LIBB_DELEXP,LIB_FLAGS(a6)
  478.  move.l a6,d0
  479.  rts
  480.  
  481. CloseLib
  482.  moveq #0,d0
  483.  subq.w #1,LIB_OPENCNT(a6)
  484.  bne.s StillInUse
  485.  btst #LIBB_DELEXP,LIB_FLAGS(a6)
  486.  beq.s NoDelExp
  487.  bsr ExpungeLib
  488. NoDelExp
  489. StillInUse
  490.  rts
  491.  
  492. ExpungeLib
  493.  movem.l d1-a6,-(sp)
  494.  tst.w LIB_OPENCNT(a6)
  495.  beq.s NoMoreUsers
  496.  bset #LIBB_DELEXP,LIB_FLAGS(a6)
  497.  moveq #0,d0
  498.  bra.s LeaveExpungeLib
  499. NoMoreUsers
  500.  move.l a6,a5
  501.  move.l a5,a1
  502.  CallSys Remove
  503.  move.l BASBASE_SEGLIST(a5),d2
  504.  move.l a5,a1
  505.  moveq #0,d0
  506.  move.w LIB_NEGSIZE(a5),d0
  507.  sub.l d0,a1
  508.  add.w LIB_POSSIZE(a5),d0
  509.  CallSys FreeMem
  510.  move.l d2,d0
  511. LeaveExpungeLib
  512.  movem.l (sp)+,d1-a6
  513.  rts
  514.  
  515. ExtFuncLib
  516.  moveq #0,d0
  517.  rts
  518.  
  519. EndCode
  520.  
  521. ; **********************************************************************
  522. ; *                                                                    *
  523. ; * Strukturen                                                         *
  524. ; *                                                                    *
  525. ; **********************************************************************
  526.  
  527. ; Für LINE INPUT [#]
  528.  
  529. MAXLINEINPUTLEN EQU 256
  530.  
  531. ; Struktur, die zu Anfang übergeben wird
  532.  
  533.  STRUCTURE STARTUP,0
  534.  WORD ST_Flags                    ; Flaggen - derzeit unbenutzt
  535.  WORD ST_Size                     ; Länge der Struktur
  536.  WORD ST_GlobalStringsSize        ; A5-Speicher
  537.  WORD ST_GlobalVarsSize           ; A5-Speicher
  538.  WORD ST_GlobalConstStringsSize   ; A5-Speicher
  539.  LONG ST_ConstStringsPointer      ; Anfang der konstanten Strings
  540.  LONG ST_DataPointer              ; Anfang der DATA-Offsets (zu A5)
  541.  WORD ST_NumData                  ; Anzahl der DATA-Elemente
  542.  LONG ST_StringsMemSize           ; Größe des Speichers für Strings
  543.  LONG ST_StackMemSize             ; Stack für GOSUB/CALL
  544.  LONG ST_EndPrg                   ; CloseLibrary-Routine-Zeiger für Ende
  545.  LONG ST_StartPrg                 ; Start des Programmes
  546.  LABEL STARTUP_SIZEOF
  547.  
  548. ; Struktur für ein Feld
  549.  
  550.  STRUCTURE FIELD,0
  551.  LONG FIELD_NEXT      ; Zeiger auf nächstes Feld (für Speicherreservierung)
  552.  LONG FIELD_TEXTPRED  ; Zeiger auf vorheriges Textfeld
  553.  LONG FIELD_TEXTSUCC  ; Zeiger auf nächstes Textfeld
  554.  LONG FIELD_MEM       ; Zeiger auf reservierten Speicher
  555.  LONG FIELD_MEMSIZE   ; Größe des Speichers
  556.  WORD FIELD_NUMDIMS   ; Anzahl der Dimensionen
  557.  LABEL FIELD_FIRSTDIM ; Ab hier werden die Größen der Dimensionen abgelegt
  558.  
  559. FIELD_MINSIZE EQU FIELD_NUMDIMS
  560.  
  561. ; Struktur für ein geöffnetes File
  562.  
  563. BUFFERSIZE EQU 4096
  564.  
  565.  STRUCTURE FILE,0
  566.  LONG FL_NEXT              ; Muß das 1. Element sein
  567.  WORD FL_NUMBER
  568.  WORD FL_ACCESSMODE
  569.  LONG FL_FILELENGTH
  570.  LONG FL_BUFFEROFFSET
  571.  LONG FL_BUFFERNUMBYTES
  572.  LONG FL_FILEPOS
  573.  LONG FL_FILEHANDLE
  574.  STRUCT FL_BUFFER,BUFFERSIZE
  575.  LABEL FL_SIZEOF
  576.  
  577. IOACCESS_INPUT     EQU 1
  578. IOACCESS_OUTPUT    EQU 2
  579. IOACCESS_READWRITE EQU 3
  580.  
  581. ; Struktur für ein Fenster
  582.  
  583.  STRUCTURE FENSTER,0
  584.  LONG FENSTER_NEXT
  585.  LONG FENSTER_WINDOW
  586.  LONG FENSTER_CONSOLEWRITE
  587.  WORD FENSTER_NUMBER
  588.  LONG FENSTER_TITLE
  589.  LABEL FENSTER_SIZEOF
  590.  
  591. Window_MinWidth EQU 100
  592. Window_MinHeight EQU 50
  593.  
  594. ; Der Stack wächst von unten nach oben.
  595. ; Bei STACK_GOSUB ist unter dem Typ nur die Rückkehradresse abgespeichert
  596. ; Bei STACK_SUB liegt über der SUBSTACK Struktur die Variablentabelle der
  597. ;   numerischen und TEXT-Variablen, darüber liegt in einem Langwort
  598. ;   die Größe des benutzten Speichers
  599. ; Bei STACK_CALL ist unter dem Typ nur die Rückkehradresse abgespeichert
  600. ;
  601. ; Stackablage-Typen:
  602. STACK_GOSUB EQU 1
  603. STACK_SUB EQU 2
  604. STACK_CALL EQU 3
  605.  
  606.  STRUCTURE SUBSTACK,0
  607.  LONG SUBSTACK_OLDFIRSTLOCALFIELD
  608.  LONG SUBSTACK_OLDA4
  609.  STRUCT SUBSTACK_TEXTFIELD,FIELD_MINSIZE
  610.  LABEL SUBSTACK_VARTAB
  611.  
  612. ; Anzahl der Stellen von single/double-real-Variablen
  613.  
  614. IEEEDP_NumNumbers EQU 14
  615. SP_NumNumbers EQU 7
  616.  
  617. ; Alle Variable
  618.  
  619. MAXTEMP EQU 20               ; Höchstanzahl an temporären Strings
  620. MAXRAWKEYS EQU 20            ; Soviele Zeichen werden zwischengespeichert
  621. MAXCONSOLECHARS EQU 10       ; So lang kann ein ANSI-String höchsten sein
  622.  
  623.  STRUCTURE VARS,0
  624.  
  625.  STRUCT TempField,FIELD_MINSIZE ; Hieran werden alle Stringfelder gehängt
  626.  STRUCT TempMem,MAXTEMP*4
  627.  WORD TempNumber
  628.  
  629.  STRUCT RawKeyBuffer,4*MAXRAWKEYS
  630.  WORD FirstRawKey
  631.  WORD LastRawKey
  632.  WORD NumRawKeys
  633.  
  634.  STRUCT InputEvent,ie_SIZEOF
  635.  
  636.  STRUCT ConsoleBuffer,MAXCONSOLECHARS
  637.  
  638.  STRUCT GlobalStringsField,FIELD_MINSIZE ; SHARED-Stringsfeld (für GCollection)
  639.  
  640.  WORD GlobalStringsSize
  641.  WORD GlobalVarsSize
  642.  WORD GlobalConstStringsSize
  643.  
  644.  LONG StackMem
  645.  LONG StackMemSize
  646.  LONG StackPointer
  647.  
  648.  LONG A5Mem
  649.  LONG A5MemSize
  650.  
  651.  LONG MemListPointer
  652.  LONG FensterListPointer
  653.  LONG FileListPointer        ; Zeiger auf erste File-Struktur
  654.  
  655.  LONG StartPrg
  656.  LONG EndPrg                 ; Hierhin muß bei einem Abbruch gesprungen
  657.                              ;  werden
  658.  
  659.  LONG StringsMemSize         ; Länge des String-Speichers
  660.  LONG StringsMem             ; Adresse des String-Speichers
  661.  LONG FreeStringPointer      ; Zeigt auf den nächsten freien Platz für
  662.                              ;  Strings (auf Longword vor Länge)
  663.  
  664.  LONG ThisIoError            ; Nummer des IO-Error oder Null wenn keiner
  665.  LONG ThisSourceLine         ; Um auch nach dem Compilieren die Nummer
  666.                              ;  der Zeile festellten zu können, in der
  667.                              ;  ein Fehler aufgetreten ist
  668.  
  669.  LONG _ConsoleDevice         ; Library-Base-Pointer
  670.  LONG _DOSBase
  671.  LONG _IntuitionBase
  672.  LONG _GfxBase
  673.  LONG _MathBase
  674.  LONG _MathTransBase
  675.  LONG _MathIeeeDoubBasBase
  676.  LONG _MathIeeeDoubTransBase
  677.  
  678.  LONG CurrentMsg             ; Zwischenspeicher für Messages
  679.  
  680.  LABEL MousePositions        ; Mauspostitions-Variable
  681.  WORD NowX
  682.  WORD NowY
  683.  WORD DownX
  684.  WORD DownY
  685.  WORD UpX
  686.  WORD UpY
  687.  WORD PressedTimes
  688.  WORD StatNow                ; 0 = nicht gedrückt
  689.  
  690.  LONG Seconds                ; Für TIMER und DATE$ Funktionen
  691.  LONG Micros
  692.  
  693.  LONG ArgLength              ; CLI-Parameter
  694.  LONG ArgPointer
  695.  
  696.  LONG OldSP                  ; Sicherung des StackPointers
  697.  LONG BasBase
  698.  
  699.  LONG FileInfoBlock
  700.  
  701.  BYTE InitOk                 ; wurde INIT__ vollständig abgearbeitet?
  702.  
  703.  BYTE DoEndImm               ; Darf Programm sofort abgebrochen werden?
  704.                              ;  (0 = Ja)
  705.  BYTE StopAtNextOccasion     ; Bei nächster Gelegenheit anhalten
  706.  
  707.  BYTE ErrorOccured           ; Ist schon ein Fehler aufgetreten?
  708.  
  709.  LONG OutputFenster          ; aktuelles Ausgabefenster
  710.  
  711.  
  712.  WORD NextData               ; Nummer des nächsten zu lesenden Dataelementes
  713.  WORD NumData                ; Anzahl aller Dataelemente
  714.  LONG DataPointer            ; Zeiger auf erstes Dataelement
  715.  
  716.  STRUCT NewWindowStruct,nw_SIZE
  717.  
  718.  LONG WBMessage
  719.  
  720.  LONG FirstLocalField        ; Liste der lokalen Felder
  721.  LONG FirstGlobalField       ; Liste der globalen Felder
  722.  
  723.  STRUCT IntuiText,it_SIZEOF
  724.  
  725.  STRUCT ErrorLongBuffer,20   ; für Zeilennummer
  726.  
  727.  LONG TrapSeven              ; für TRAPV
  728.  
  729.  STRUCT DecMantisse,20       ; für STR_R_T, STR_D_T
  730.  STRUCT VALVar,8
  731.  
  732.  LABEL PosSize
  733.  
  734. ; **********************************************************************
  735. ; *                                                                    *
  736. ; * Strings                                                            *
  737. ; *                                                                    *
  738. ; **********************************************************************
  739.  
  740. BASICText MACRO
  741. \1
  742.  dc.l *+4
  743.  dc.w \@Length
  744. \@Start EQU *
  745.  dc.b \2
  746. \@Length EQU *-\@Start
  747.  dc.b 0
  748.  even
  749.  ENDM
  750.  
  751.  BASICText DeleteLeftText,<8," ",8>
  752.  BASICText TabText,<9>
  753.  BASICText RetText,<10>
  754.  BASICText ClsText,<12>
  755.  BASICText QMarkText,<'?'>
  756.  BASICText FilesText,<"Directory of: ">
  757.  BASICText CursorOffText,<$9b,'0 p'>
  758.  BASICText CursorOnText,<$9b,' p'>
  759.  BASICText DefaultWindowText,<'Cursor V1.0 (c) 1990 Jürgen Forster'>
  760. LeerString
  761.  dc.l *+4,0
  762. ;BASICText LeerString,<>
  763.  
  764. DOSName
  765.  dc.b 'dos.library',0
  766. IntuitionName
  767.  dc.b 'intuition.library',0
  768. GfxName
  769.  dc.b 'graphics.library',0
  770. MathName
  771.  dc.b 'mathffp.library',0
  772. MathTransName
  773.  dc.b 'mathtrans.library',0
  774. MathIeeeDoubBasName
  775.  dc.b 'mathieeedoubbas.library',0
  776. MathIeeeDoubTransName
  777.  dc.b 'mathieeedoubtrans.library',0
  778. ConsoleName
  779.  dc.b 'console.device',0
  780.  even
  781. NullWord
  782.  dc.w 0
  783.  
  784. ; **********************************************************************
  785. ; *                                                                    *
  786. ; * Macros                                                             *
  787. ; *                                                                    *
  788. ; **********************************************************************
  789.  
  790. Break_On MACRO
  791.  bsr TestForBreak
  792.  ENDM
  793.  
  794. Break_Off MACRO
  795.  addq.b #1,DoEndImm(a5)
  796.  ENDM
  797.  
  798. IEEEDPFieee MACRO
  799. ; CallMathIeeeDoubTrans IEEEDPFieee
  800. ; diese Funktion der IEEEDoubBas-Library hat einen Fehler
  801.  moveq #0,d1
  802.  move.l d0,a0
  803.  swap d0
  804.  beq.s \@ReturnZero
  805.  move.w d0,d1
  806.  and.l #$7f80,d0   ; Hier steht in der IEEEDoubBas-Library and.i!
  807.  asr.w #3,d0
  808.  add.w #$3800,d0
  809.  and.w #$8000,d1
  810.  or.w d1,d0
  811.  swap d0
  812.  move.l a0,d1
  813.  ror.l #3,d1
  814.  move.l d1,a0
  815.  and.l #$fffff,d1
  816.  or.l d1,d0
  817.  move.l a0,d1
  818.  and.l #$e0000000,d1
  819. \@ReturnZero
  820.  ENDM
  821.  
  822. ; **********************************************************************
  823. ; *                                                                    *
  824. ; * diverse Unterroutinen                                              *
  825. ; *                                                                    *
  826. ; **********************************************************************
  827.  
  828. TestStackMem
  829.  move.l d1,-(sp)
  830.  move.l StackMem(a5),d1
  831.  add.l StackMemSize(a5),d1
  832.  sub.l StackPointer(a5),d1
  833.  cmp.l d1,d0
  834.  bgt ErrorStackOverflow
  835.  move.l (sp)+,d1
  836.  rts
  837.  
  838. ; Zeiger auf Feld in a0
  839. AddTextField
  840.  movem.l a1/a2,-(sp)
  841.  lea TempField(a5),a1
  842.  move.l a1,FIELD_TEXTPRED(a0)
  843.  move.l FIELD_TEXTSUCC(a1),a2
  844.  move.l a2,FIELD_TEXTSUCC(a0)
  845.  move.l a0,FIELD_TEXTSUCC(a1)
  846.  cmp.l #0,a2
  847.  beq.s ThereIsNoSuccessor
  848.  move.l a0,FIELD_TEXTPRED(a2)
  849. ThereIsNoSuccessor
  850.  movem.l (sp)+,a1/a2
  851.  rts
  852.  
  853. ; Zeiger auf 1. Feld in a0
  854. FreeFieldList
  855.  move.l a2,-(sp)
  856.  move.l a0,a2
  857. FreeFieldListLoop
  858.  cmp.l #0,a2
  859.  beq.s FreeFieldListReady
  860.  tst.l FIELD_MEM(a2)
  861.  beq.s NoFieldMemAllocated
  862.  move.l FIELD_MEM(a2),a1
  863.  bsr MyFreeMem
  864. NoFieldMemAllocated
  865.  clr.l FIELD_MEM(a2)
  866.  clr.l FIELD_MEMSIZE(a2)
  867.  tst.l FIELD_TEXTPRED(a2)
  868.  beq.s NotInFieldList
  869.  move.l FIELD_TEXTPRED(a2),a0
  870.  move.l FIELD_TEXTSUCC(a2),FIELD_TEXTSUCC(a0)
  871.  tst.l FIELD_TEXTSUCC(a2)
  872.  beq.s NoSuccesor
  873.  move.l FIELD_TEXTSUCC(a2),a0
  874.  move.l FIELD_TEXTPRED(a2),FIELD_TEXTPRED(a0)
  875. NoSuccesor
  876. NotInFieldList
  877.  move.l FIELD_NEXT(a2),a2
  878.  bra.s FreeFieldListLoop
  879. FreeFieldListReady
  880.  move.l (sp)+,a2
  881.  rts
  882.  
  883. ; Zeiger auf Fenster ist in A0
  884. OpenConsole
  885.  movem.l d1-a5,-(sp)
  886.  move.l a0,d7
  887.  moveq #0,d0
  888.  move.l d0,a0
  889.  bsr _CreatePort
  890.  tst.l d0
  891.  beq.s NoPort
  892.  move.l d0,a2
  893.  move.l a2,a0
  894.  bsr _CreateStdIO
  895.  tst.l d0
  896.  beq.s NoIO
  897.  move.l d0,a3
  898.  move.l d7,IO_DATA(a3)
  899.  move.l #wd_Size,IO_LENGTH(a3)
  900.  lea ConsoleName,a0
  901.  moveq #0,d0
  902.  move.l a3,a1
  903.  moveq #0,d1
  904.  CallSys OpenDevice
  905.  tst.l d0
  906.  bne NoConsole
  907.  move.l a3,d0
  908.  movem.l (sp)+,d1-a5
  909.  rts
  910. NoConsole
  911.  move.l a3,a0
  912.  bsr _DeleteStdIO
  913. NoIO
  914.  move.l a2,a0
  915.  bsr _DeletePort
  916. NoPort
  917.  moveq #0,d0
  918.  movem.l (sp)+,d1-a5
  919.  rts
  920.  
  921. ; IoStruktur in A0
  922. CloseConsole
  923.  movem.l d0/d1/a0/a1/a2,-(sp)
  924.  move.l a0,a2
  925.  move.l a2,a1
  926.  CallSys CloseDevice
  927.  move.l MN_REPLYPORT(a2),a0
  928.  bsr _DeletePort
  929.  move.l a2,a0
  930.  bsr _DeleteStdIO
  931.  movem.l (sp)+,d0/d1/a0/a1/a2
  932.  rts
  933.  
  934. ; Für die Exec-Routine RawDoFmt
  935. RawDoFmtProc
  936.  move.b d0,(a3)+
  937.  rts
  938.  
  939. ; >- d0: Divident, d1: Divisor
  940. ; -> d0: Rest, d1: Ergebnis
  941. ULONGDiv
  942.  movem.l d2/d3,-(sp)
  943.  moveq #0,d3
  944.  moveq #31,d2
  945. DivLoop
  946.  lsl.l #1,d0
  947.  roxl.l #1,d3
  948.  cmp.l d1,d3
  949.  blt.s NoSub
  950.  sub.l d1,d3
  951.  addq.w #1,d0
  952. NoSub
  953.  dbra d2,DivLoop
  954.  move.l d3,d1
  955.  movem.l (sp)+,d2/d3
  956.  rts
  957.  
  958. CursorOn
  959.  pea CursorOnText
  960.  bsr PRINT_T_
  961.  rts
  962.  
  963. CursorOff
  964.  pea CursorOffText
  965.  bsr PRINT_T_
  966.  rts
  967.  
  968. ; **********************************************************************
  969. ; *                                                                    *
  970. ; * Speicherreservierung                                               *
  971. ; *                                                                    *
  972. ; **********************************************************************
  973.  
  974. ; MyAllocMem verändert nur das Register D0, MyFreeMem gar keine
  975.  
  976. ; d0/d1 wie bei AllocMem
  977. MyAllocMem
  978.  movem.l d1/a0/a1,-(sp)
  979.  addq.l #8,d0
  980.  move.l d0,-(sp)
  981.  CallSys AllocMem
  982.  tst.l d0
  983.  beq ErrorOutOfMemory
  984.  move.l d0,a0
  985.  move.l MemListPointer(a5),(a0)
  986.  move.l d0,MemListPointer(a5)
  987.  addq.l #8,d0
  988.  move.l (sp)+,4(a0)
  989.  movem.l (sp)+,d1/a0/a1
  990.  rts
  991.  
  992. MyFreeAllMem
  993.  move.l MemListPointer(a5),a2
  994. FreeAllLoop
  995.  cmp.l #0,a2
  996.  beq.s NoMoreMem
  997.  move.l a2,a1
  998.  move.l 4(a2),d0
  999.  move.l (a2),a2    ; Nächsten Zeiger vor FreeMem holen
  1000.  CallSys FreeMem
  1001.  bra.s FreeAllLoop
  1002. NoMoreMem
  1003.  rts
  1004.  
  1005. ; Zeiger auf Mem-Block in a1
  1006. MyFreeMem
  1007.  movem.l d0/d1/a0/a1,-(sp)
  1008.  subq.l #8,a1
  1009.  lea MemListPointer(a5),a0
  1010. FreeMemLoop
  1011.  tst (a0)
  1012.  beq ErrorFreeMem
  1013.  cmp.l (a0),a1
  1014.  beq.s FoundMemBlock
  1015.  move.l (a0),a0
  1016.  bra.s FreeMemLoop
  1017. FoundMemBlock
  1018.  move.l (a1),(a0)
  1019.  move.l 4(a1),d0
  1020.  CallSys FreeMem
  1021.  movem.l (sp)+,d0/d1/a0/a1
  1022.  rts
  1023.  
  1024. ; **********************************************************************
  1025. ; *                                                                    *
  1026. ; * Zeicheneingaben vom Fenster behandeln                              *
  1027. ; *                                                                    *
  1028. ; **********************************************************************
  1029.  
  1030. ; Ist d0 = 0, so wird nicht gewartet, in d0 wird das erhaltene Zeichen
  1031. ; zurückgegeben, ist d0 gleich -1.l, so wurde kein Zeichen gelesen
  1032.  
  1033. GetOneChar
  1034.  Break_Off
  1035.  movem.l d1-a6,-(sp)
  1036.  move.l d0,d7
  1037. GetOneCharLoop
  1038.  tst.w NumRawKeys(a5)
  1039.  bne.s HaveRawKey
  1040.  tst.l d7
  1041.  beq.s GotNoChar
  1042.  moveq #1,d1
  1043.  CallDOS Delay
  1044.  bra.s GetOneCharLoop
  1045. GotNoChar
  1046.  moveq #-1,d0
  1047.  movem.l (sp)+,d1-a6
  1048.  Break_On
  1049.  rts
  1050. HaveRawKey
  1051.  move.b #IECLASS_RAWKEY,InputEvent+ie_Class(a5)
  1052.  move.w FirstRawKey(a5),d0
  1053.  lsl.w #2,d0
  1054.  move.w RawKeyBuffer(a5,d0.w),InputEvent+ie_Code(a5)
  1055.  move.w RawKeyBuffer+2(a5,d0.w),InputEvent+ie_Qualifier(a5)
  1056.  move.w FirstRawKey(a5),d0
  1057.  addq.w #1,d0
  1058.  cmp.w #MAXRAWKEYS,d0
  1059.  bne.s NotAtEndOfRawKeys
  1060.  moveq #0,d0
  1061. NotAtEndOfRawKeys
  1062.  move.w d0,FirstRawKey(a5)
  1063.  subq.w #1,NumRawKeys(a5)
  1064.  lea InputEvent(a5),a0
  1065.  lea ConsoleBuffer(a5),a1
  1066.  moveq #MAXCONSOLECHARS,d1
  1067.  sub.l a2,a2
  1068.  CallConsole RawKeyConvert
  1069.  tst.l d0
  1070.  ble GetOneCharLoop
  1071.  cmp.l #1,d0
  1072.  beq.s ReturnOneChar
  1073.  lea ConvertTable(pc),a0
  1074.  tst.b (a0)
  1075.  beq.s GetOneCharLoop
  1076. ConvertLoop
  1077.  move.l d0,d1
  1078.  lea ConsoleBuffer(a5),a1
  1079.  bra.s EnterCompareLoop
  1080. CompareLoop
  1081.  tst.b (a0)
  1082.  beq.s NotThisString
  1083.  cmp.b (a0)+,(a1)+
  1084.  bne.s NotThisString
  1085. EnterCompareLoop
  1086.  dbra d1,CompareLoop
  1087.  tst.b (a0)+
  1088.  bne.s NotThisString
  1089.  moveq #0,d0
  1090.  move.b (a0)+,d0
  1091.  bra.s ReturnD0Char
  1092. NotThisString
  1093.  tst.b (a0)+
  1094.  bne.s NotThisString
  1095.  addq.l #1,a0
  1096.  bra.s ConvertLoop
  1097. ReturnOneChar
  1098.  moveq #0,d0
  1099.  move.b ConsoleBuffer(a5),d0
  1100. ReturnD0Char
  1101.  movem.l (sp)+,d1-a6
  1102.  Break_On
  1103.  rts
  1104.  
  1105. ConvertTable
  1106.  dc.b $9b,'Z',0,9            ; SHIFT+TAB (von Amiga-Basic nicht beachtet)
  1107.  dc.b $9b,'A',0,28           ; CSRUP
  1108.  dc.b $9b,'T',0,28
  1109.  dc.b $9b,'B',0,29           ; DOWN
  1110.  dc.b $9b,'S',0,29
  1111.  dc.b $9b,'C',0,30           ; RIGHT
  1112.  dc.b $9b,' @',0,30
  1113.  dc.b $9b,'D',0,31           ; LEFT
  1114.  dc.b $9b,' A',0,31
  1115.  dc.b $9b,'?~',0,139         ; HELP
  1116.  dc.b $9b,'0~',0,129         ; F1
  1117.  dc.b $9b,'10~',0,129
  1118.  dc.b $9b,'1~',0,130         ; F2
  1119.  dc.b $9b,'11~',0,130
  1120.  dc.b $9b,'2~',0,131         ; F3
  1121.  dc.b $9b,'12~',0,131
  1122.  dc.b $9b,'3~',0,132         ; F4
  1123.  dc.b $9b,'13~',0,132
  1124.  dc.b $9b,'4~',0,133         ; F5
  1125.  dc.b $9b,'14~',0,133
  1126.  dc.b $9b,'5~',0,134         ; F6
  1127.  dc.b $9b,'15~',0,134
  1128.  dc.b $9b,'6~',0,135         ; F7
  1129.  dc.b $9b,'16~',0,135
  1130.  dc.b $9b,'7~',0,136         ; F8
  1131.  dc.b $9b,'17~',0,136
  1132.  dc.b $9b,'8~',0,137         ; F9
  1133.  dc.b $9b,'18~',0,137
  1134.  dc.b $9b,'9~',0,138         ; F10
  1135.  dc.b $9b,'19~',0,138
  1136.  dc.b 0                      ; Ende
  1137.  even
  1138.  
  1139. ; **********************************************************************
  1140. ; *                                                                    *
  1141. ; * Exception/Trap behandeln                                           *
  1142. ; *                                                                    *
  1143. ; **********************************************************************
  1144.  
  1145. ExceptionCode
  1146.  movem.l d0-a6,-(sp)
  1147.  move.l 4,a5
  1148.  move.l ThisTask(a5),a5
  1149.  move.l TC_Userdata(a5),a5
  1150.  move.l BasBase(a5),a6
  1151.  bsr.s HandleMessages
  1152.  movem.l (sp)+,d0-a6
  1153.  rts
  1154.  
  1155. HandleMessages
  1156.  lea FensterListPointer(a5),a3
  1157. HandleMessagesFensterLoop
  1158.  tst.l FENSTER_NEXT(a3)
  1159.  beq.s NoMoreHandleMessagesFensters
  1160.  move.l FENSTER_NEXT(a3),a3
  1161. TryNextMessage
  1162.  move.l FENSTER_WINDOW(a3),a0
  1163.  move.l wd_UserPort(a0),a0
  1164.  CallSys GetMsg
  1165.  tst.l d0
  1166.  beq.s NoMessageHere
  1167.  move.l d0,a2
  1168.  bsr.s HandleMessage
  1169.  move.l a2,a1
  1170.  CallSys ReplyMsg
  1171.  bra.s TryNextMessage
  1172. NoMessageHere
  1173.  bra.s HandleMessagesFensterLoop
  1174. NoMoreHandleMessagesFensters
  1175.  rts
  1176.  
  1177. ; Message in a2
  1178. ; Fenster in a3
  1179. HandleMessage
  1180.  cmp.l #CLOSEWINDOW,im_Class(a2)
  1181.  beq Message_CLOSEWINDOW
  1182.  cmp.l #RAWKEY,im_Class(a2)
  1183.  beq Message_RAWKEY
  1184.  rts
  1185.  
  1186. Message_CLOSEWINDOW
  1187.  tst.b DoEndImm(a5)
  1188.  beq.s DoEnd
  1189.  move.b #1,StopAtNextOccasion(a5)
  1190.  bra.s NotAtOnce
  1191. DoEnd
  1192.  move.l a2,a1
  1193.  CallSys ReplyMsg
  1194.  bra END___NoCheck
  1195. NotAtOnce
  1196.  rts
  1197.  
  1198. Message_RAWKEY
  1199.  move.w im_Code(a2),d0
  1200.  tst.b d0
  1201.  bmi.s KeyUpAgain
  1202.  cmp.w #MAXRAWKEYS,NumRawKeys(a5)
  1203.  beq.s DontAddRawKey
  1204.  move.w LastRawKey(a5),d0
  1205.  lsl.w #2,d0
  1206.  move.w im_Code(a2),RawKeyBuffer(a5,d0.w)
  1207.  move.w im_Qualifier(a2),RawKeyBuffer+2(a5,d0.w)
  1208.  move.w LastRawKey(a5),d0
  1209.  addq.w #1,d0
  1210.  cmp.w #MAXRAWKEYS,d0
  1211.  bne.s NotRawEndReached
  1212.  moveq #0,d0
  1213. NotRawEndReached
  1214.  move.w d0,LastRawKey(a5)
  1215.  addq.w #1,NumRawKeys(a5)
  1216. KeyUpAgain
  1217.  rts
  1218. DontAddRawKey
  1219.  bra BEEP__
  1220.  
  1221. TestForBreak
  1222.  subq.b #1,DoEndImm(a5)
  1223.  bne.s NotLastBreakOff
  1224.  tst.b StopAtNextOccasion(a5)
  1225.  beq.s WasNoBreak
  1226.  bra END___NoCheck
  1227. WasNoBreak
  1228. NotLastBreakOff
  1229.  rts
  1230.  
  1231. TrapCode
  1232.  addq.l #4,sp
  1233.  lea ErrorOverflow,a0
  1234.  move.l a0,2(sp)
  1235.  rte
  1236.  
  1237. ; **********************************************************************
  1238. ; *                                                                    *
  1239. ; * Öffnet alles (bricht Programm bei Fehler ab)                       *
  1240. ; *                                                                    *
  1241. ; **********************************************************************
  1242.  
  1243. INIT__
  1244. ; Zeiger auf Startup-Struktur wird in A2 übergeben und sofort ausgewertet
  1245. ; In d3 ist ggf. ein Zeiger auf die Workbench-Message
  1246. ; In d4/d5 sind die vorherigen D0/A0
  1247.  
  1248. ; A5 ganz zu Anfang aufbauen
  1249.  moveq #0,d0
  1250.  move.w ST_GlobalStringsSize(a2),d0
  1251.  add.w ST_GlobalVarsSize(a2),d0
  1252.  add.w ST_GlobalConstStringsSize(a2),d0
  1253.  move.l d0,d7
  1254.  add.l #PosSize,d0
  1255.  move.l d0,d6
  1256.  move.l #MEMF_CLEAR,d1
  1257.  CallSys AllocMem
  1258.  tst.l d0
  1259.  bne.s HaveA5Mem
  1260.  addq.l #4,sp
  1261.  move.l ST_EndPrg(a2),a0
  1262.  moveq #0,d7
  1263.  jmp (a0)
  1264. HaveA5Mem
  1265.  move.l d0,a5
  1266.  add.l d7,a5
  1267.  move.l d0,A5Mem(a5)
  1268.  move.l d6,A5MemSize(a5)
  1269.  move.w ST_GlobalStringsSize(a2),GlobalStringsSize(a5)
  1270.  move.w ST_GlobalVarsSize(a2),GlobalVarsSize(a5)
  1271.  move.w ST_GlobalConstStringsSize(a2),GlobalConstStringsSize(a5)
  1272.  
  1273.  move.l ST_EndPrg(a2),EndPrg(a5)
  1274.  lea 4(sp),a0
  1275.  move.l a0,OldSP(a5)
  1276.  move.l a6,BasBase(a5)
  1277.  
  1278.  move.l ST_StartPrg(a2),StartPrg(a5)
  1279.  addq.l #4,sp
  1280.  
  1281. ; Workbench-Message merken
  1282.  move.l d3,WBMessage(a5)
  1283.  
  1284. ;
  1285. ; Libs öffnen
  1286. ;
  1287.  
  1288.  move.l 4,a0
  1289.  lea DeviceList(a0),a0
  1290.  lea ConsoleName(pc),a1
  1291.  CallSys FindName
  1292.  move.l d0,_ConsoleDevice(a5)
  1293.  beq END___NoCheck
  1294.  
  1295.  lea DOSName,a1
  1296.  CallSys OldOpenLibrary
  1297.  move.l d0,_DOSBase(a5)
  1298.  beq END___NoCheck
  1299.  
  1300.  lea IntuitionName,a1
  1301.  CallSys OldOpenLibrary
  1302.  move.l d0,_IntuitionBase(a5)
  1303.  beq END___NoCheck
  1304.  
  1305.  lea GfxName,a1
  1306.  CallSys OldOpenLibrary
  1307.  move.l d0,_GfxBase(a5)
  1308.  beq END___NoCheck
  1309.  
  1310.  lea MathName,a1
  1311.  CallSys OldOpenLibrary
  1312.  move.l d0,_MathBase(a5)
  1313.  beq ErrorNoMathLibrary
  1314.  
  1315.  lea MathTransName,a1
  1316.  CallSys OldOpenLibrary
  1317.  move.l d0,_MathTransBase(a5)
  1318.  beq ErrorNoMathTransLibrary
  1319.  
  1320.  lea MathIeeeDoubBasName,a1
  1321.  CallSys OldOpenLibrary
  1322.  move.l d0,_MathIeeeDoubBasBase(a5)
  1323.  beq ErrorNoMathIeeeDoubBasLibrary
  1324.  
  1325.  lea MathIeeeDoubTransName,a1
  1326.  CallSys OldOpenLibrary
  1327.  move.l d0,_MathIeeeDoubTransBase(a5)
  1328.  beq ErrorNoMathIeeeDoubTransLibrary
  1329.  
  1330. ; Baut die Zeiger auf die konstanten Strings auf
  1331.  move.l ST_ConstStringsPointer(a2),a0
  1332.  move.l A5Mem(a5),a1         ; Anfang der ConstStrings
  1333.  move.w ST_GlobalConstStringsSize(a2),d0
  1334.  lsr.w #2,d0
  1335.  bra.s EnterBuildConstStringsLoop
  1336. BuildConstStringsLoop
  1337.  move.l a0,(a1)+
  1338.  move.w (a0),d1
  1339.  addq.w #4,d1
  1340.  bclr #0,d1
  1341.  add.w d1,a0
  1342. EnterBuildConstStringsLoop
  1343.  dbra d0,BuildConstStringsLoop
  1344.  
  1345.  move.l ST_DataPointer(a2),DataPointer(a5)
  1346.  move.w ST_NumData(a2),NumData(a5)
  1347.  
  1348.  move.l ST_StringsMemSize(a2),d0
  1349.  move.l d0,StringsMemSize(a5)
  1350.  moveq #0,d1
  1351.  bsr MyAllocMem
  1352.  move.l d0,StringsMem(a5)
  1353.  
  1354.  move.l ST_StackMemSize(a2),d0
  1355.  move.l d0,StackMemSize(a5)
  1356.  moveq #0,d1
  1357.  bsr MyAllocMem
  1358.  move.l d0,StackMem(a5)
  1359.  move.l d0,StackPointer(a5)
  1360.  
  1361. ; Diese müßen noch behandelt werden DEBUG
  1362.  move.l d4,d0
  1363.  move.l d5,a0
  1364.  
  1365. ;
  1366. ; Speicher holen
  1367. ;
  1368.  
  1369.  move.l #fib_SIZEOF,d0
  1370.  moveq #0,d1
  1371.  bsr MyAllocMem
  1372.  move.l d0,FileInfoBlock(a5)
  1373.  
  1374. ;
  1375. ; Stringsvariable initialisieren
  1376. ;
  1377.  
  1378.  move.l StringsMem(a5),FreeStringPointer(a5)
  1379.  
  1380.  move.l a5,a1
  1381.  move.l a5,a0
  1382.  sub.w GlobalStringsSize(a5),a0
  1383.  bsr ClearTextField
  1384.  
  1385. ; Tempstrings
  1386.  lea TempMem(a5),a0
  1387.  lea MAXTEMP*4(a0),a1
  1388.  bsr ClearTextField
  1389.  
  1390.  lea TempField(a5),a0
  1391.  lea TempMem(a5),a1
  1392.  move.l a1,FIELD_MEM(a0)
  1393.  move.l #MAXTEMP*4,FIELD_MEMSIZE(a0)
  1394.  
  1395. ; SHARED-Strings
  1396.  move.l a5,a0
  1397.  sub.w GlobalStringsSize(a5),a0
  1398.  move.l a5,a1
  1399.  bsr ClearTextField
  1400.  
  1401.  lea GlobalStringsField(a5),a0
  1402.  moveq #0,d0
  1403.  move.w GlobalStringsSize(a5),d0
  1404.  move.l d0,FIELD_MEMSIZE(a0)
  1405.  neg.l d0
  1406.  add.l a5,d0
  1407.  move.l d0,FIELD_MEM(a0)
  1408.  bsr AddTextField
  1409.  
  1410.  moveq #7,d0
  1411.  CallSys AllocTrap
  1412.  move.l d0,TrapSeven(a5)
  1413.  bmi ErrorNoTrapSeven
  1414.  
  1415.  move.b #-1,InitOk(a5)
  1416.  
  1417.  move.l 4,a0
  1418.  move.l ThisTask(a0),a0
  1419.  lea ExceptionCode,a1
  1420.  move.l a1,TC_EXCEPTCODE(a0)
  1421.  move.l a5,TC_Userdata(a0)
  1422.  lea TrapCode,a1
  1423.  move.l a1,TC_TRAPCODE(a0)
  1424.  
  1425.  move.w #1,-(sp)   ; Kennung
  1426.  pea DefaultWindowText ; Titel
  1427.  clr.w -(sp)       ; x1
  1428.  clr.w -(sp)       ; y1
  1429.  move.w #639,-(sp) ; x2
  1430.  move.w #199,-(sp) ; y2
  1431.  move.w #%01111,-(sp) ; Typ
  1432.  move.w #1,-(sp)   ; Schirm
  1433.  bsr WINDOW_ITIIIIII_
  1434.  
  1435.  move.l StartPrg(a5),-(sp)
  1436.  rts
  1437.  
  1438. ClearTextField
  1439.  move.l a2,-(sp)
  1440.  lea NullWord(pc),a2
  1441.  bra.s CompThem
  1442. ContClearing
  1443.  move.l a2,(a0)+
  1444. CompThem
  1445.  cmp.l a1,a0
  1446.  bne.s ContClearing
  1447.  move.l (sp)+,a2
  1448.  rts
  1449.  
  1450. ; **********************************************************************
  1451. ; *                                                                    *
  1452. ; * Beendet das Programm                                               *
  1453. ; *                                                                    *
  1454. ; **********************************************************************
  1455.  
  1456. END__
  1457.  addq.l #4,sp
  1458.  cmp.l OldSP(a5),sp
  1459.  bne ErrorStackTrashed
  1460.  
  1461. END___NoCheck
  1462.  Break_Off
  1463.  move.l OldSP(a5),sp
  1464.  
  1465. ;
  1466. ; Nur ausführen, wenn INIT__ erfolgreich war
  1467. ;
  1468.  
  1469.  tst.b InitOk(a5)
  1470.  beq.s InitFailed
  1471.  
  1472. CloseFenstersLoop
  1473.  move.l FensterListPointer(a5),d0
  1474.  beq.s NoMoreFensters
  1475.  move.l d0,a0
  1476.  move.w FENSTER_NUMBER(a0),-(sp)
  1477.  bsr WINDOWCLOSE_I_
  1478.  bra.s CloseFenstersLoop
  1479. NoMoreFensters
  1480.  
  1481.  bsr CLOSE__
  1482.  
  1483.  move.b #1,DoEndImm(a5)        ; Sign setzen -> Programm wird schon beendet
  1484.  move.l 4,a0
  1485.  move.l ThisTask(a0),a0
  1486.  clr.l TC_EXCEPTCODE(a0)
  1487.  clr.b StopAtNextOccasion(a5)
  1488.  
  1489. InitFailed
  1490.  
  1491. ;
  1492. ; Das wird bei jedem END__ abgearbeitet
  1493. ;
  1494.  
  1495.  move.l TrapSeven(a5),d0
  1496.  bmi.s NoTrapSeven
  1497.  CallSys FreeTrap
  1498. NoTrapSeven
  1499.  
  1500.  tst.l _MathIeeeDoubTransBase(a5)
  1501.  beq.s NoMathIeeeDoubTransBase
  1502.  move.l _MathIeeeDoubTransBase(a5),a1
  1503.  CallSys CloseLibrary
  1504. NoMathIeeeDoubTransBase
  1505.  
  1506.  tst.l _MathIeeeDoubBasBase(a5)
  1507.  beq.s NoMathIeeeDoubBasBase
  1508.  move.l _MathIeeeDoubBasBase(a5),a1
  1509.  CallSys CloseLibrary
  1510. NoMathIeeeDoubBasBase
  1511.  
  1512.  tst.l _MathTransBase(a5)
  1513.  beq.s NoMathTransBase
  1514.  move.l _MathTransBase(a5),a1
  1515.  CallSys CloseLibrary
  1516. NoMathTransBase
  1517.  
  1518.  tst.l _MathBase(a5)
  1519.  beq.s NoMathBase
  1520.  move.l _MathBase(a5),a1
  1521.  CallSys CloseLibrary
  1522. NoMathBase
  1523.  
  1524.  tst.l _GfxBase(a5)
  1525.  beq.s NoGfxBase
  1526.  move.l _GfxBase(a5),a1
  1527.  CallSys CloseLibrary
  1528. NoGfxBase
  1529.  
  1530.  tst.l _IntuitionBase(a5)
  1531.  beq.s NoIntuitionBase
  1532.  move.l _IntuitionBase(a5),a1
  1533.  CallSys CloseLibrary
  1534. NoIntuitionBase
  1535.  
  1536.  tst.l _DOSBase(a5)
  1537.  beq.s NoDOSBase
  1538.  move.l _DOSBase(a5),a1
  1539.  CallSys CloseLibrary
  1540. NoDOSBase
  1541.  
  1542.  bsr MyFreeAllMem
  1543.  
  1544. ;
  1545. ; A5-Speicher freigeben und zurückspringen
  1546. ;
  1547.  
  1548. ; Workbench-Message zurückgeben
  1549.  move.l WBMessage(a5),d3
  1550.  move.l EndPrg(a5),a2
  1551.  move.l A5Mem(a5),a1
  1552.  move.l A5MemSize(a5),d0
  1553.  CallSys FreeMem
  1554.  moveq #0,d7
  1555.  jmp (a2)
  1556.  
  1557. ; **********************************************************************
  1558. ; *                                                                    *
  1559. ; * Konvertierungen                                                    *
  1560. ; *                                                                    *
  1561. ; **********************************************************************
  1562.  
  1563. CONVERT_D_I
  1564.  movem.l (sp)+,d0/d1/d2
  1565.  move.l d0,-(sp)
  1566.  movem.l d1/d2,-(sp)
  1567.  bsr CONVERT_D_L
  1568.  bsr CONVERT_L_I
  1569.  move.w (sp)+,d0
  1570.  move.l (sp)+,a2
  1571.  move.w d0,-(sp)
  1572.  jmp (a2)
  1573.  
  1574. CONVERT_D_L
  1575.  move.l (sp)+,a2
  1576.  movem.l (sp)+,d0/d1
  1577.  CallMathIeeeDoubBas IEEEDPFix
  1578.  bvs ErrorOverflow
  1579.  move.l d0,-(sp)
  1580.  jmp (a2)
  1581.  
  1582. CONVERT_D_R
  1583.  move.l (sp)+,a2
  1584.  movem.l (sp)+,d0/d1
  1585.  CallMathIeeeDoubTrans IEEEDPTieee
  1586.  bvs ErrorOverflow
  1587.  CallMathTrans SPFieee
  1588.  bvs ErrorOverflow
  1589.  move.l d0,-(sp)
  1590.  jmp (a2)
  1591.  
  1592. CONVERT_I_D
  1593.  move.l (sp)+,a2
  1594.  move.w (sp)+,d0
  1595.  ext.l d0
  1596.  move.l d0,-(sp)
  1597.  move.l a2,-(sp)
  1598.  bra CONVERT_L_D
  1599.  
  1600. CONVERT_I_L
  1601.  move.l (sp)+,a2
  1602.  move.w (sp)+,d0
  1603.  ext.l d0
  1604.  move.l d0,-(sp)
  1605.  jmp (a2)
  1606.  
  1607. CONVERT_I_R
  1608.  move.l (sp)+,a2
  1609.  move.w (sp)+,d0
  1610.  ext.l d0
  1611.  move.l d0,-(sp)
  1612.  move.l a2,-(sp)
  1613.  bra CONVERT_L_R
  1614.  
  1615. CONVERT_L_D
  1616.  move.l (sp)+,a2
  1617.  move.l (sp)+,d0
  1618.  CallMathIeeeDoubBas IEEEDPFlt
  1619.  movem.l d0/d1,-(sp)
  1620.  jmp (a2)
  1621.  
  1622. CONVERT_L_I
  1623.  movem.l (sp)+,a2/a3
  1624.  move.l a3,d0
  1625.  ext.l d0
  1626.  cmp.l a3,d0
  1627.  bne ErrorOverflow
  1628.  move.w d0,-(sp)
  1629.  jmp (a2)
  1630.  
  1631. CONVERT_L_R
  1632.  move.l 4(sp),d0
  1633.  CallMath SPFlt
  1634.  move.l d0,4(sp)
  1635.  rts
  1636.  
  1637. CONVERT_R_D
  1638.  move.l (sp)+,a2
  1639.  move.l (sp)+,d0
  1640.  CallMathTrans SPTieee
  1641.  IEEEDPFieee
  1642.  movem.l d0/d1,-(sp)
  1643.  jmp (a2)
  1644.  
  1645. CONVERT_R_I
  1646.  movem.l (sp)+,d0/d1
  1647.  move.l d0,-(sp)
  1648.  move.l d1,-(sp)
  1649.  bsr CONVERT_R_L
  1650.  bsr CONVERT_L_I
  1651.  move.w (sp)+,d0
  1652.  move.l (sp)+,a2
  1653.  move.w d0,-(sp)
  1654.  jmp (a2)
  1655.  
  1656. CONVERT_R_L
  1657.  move.l (sp)+,a2
  1658.  move.l (sp)+,d0
  1659.  CallMath SPFix
  1660.  bvs ErrorOverflow
  1661.  move.l d0,-(sp)
  1662.  jmp (a2)
  1663.  
  1664. ; **********************************************************************
  1665. ; *                                                                    *
  1666. ; * Arithmetische Funktionen, zuerst Vergleiche                        *
  1667. ; *                                                                    *
  1668. ; **********************************************************************
  1669.  
  1670. EQ_DD_D
  1671.  move.l (sp)+,a2
  1672.  movem.l (sp)+,d2/d3
  1673.  movem.l (sp)+,d0/d1
  1674.  CallMathIeeeDoubBas IEEEDPCmp
  1675.  seq d0
  1676.  ext.w d0
  1677.  move.w d0,-(sp)
  1678.  jmp (a2)
  1679.  
  1680. EQ_II_I
  1681.  move.l (sp)+,a2
  1682.  move.w (sp)+,d1
  1683.  move.w (sp)+,d0
  1684.  cmp.w d1,d0
  1685.  seq d0
  1686.  ext.w d0
  1687.  move.w d0,-(sp)
  1688.  jmp (a2)
  1689.  
  1690. EQ_LL_I
  1691.  move.l (sp)+,a2
  1692.  move.l (sp)+,d1
  1693.  move.l (sp)+,d0
  1694.  cmp.l d0,d1
  1695.  seq d0
  1696.  ext.w d0
  1697.  move.w d0,-(sp)
  1698.  jmp (a2)
  1699.  
  1700. EQ_RR_R
  1701.  move.l (sp)+,a2
  1702.  move.l (sp)+,d1
  1703.  move.l (sp)+,d0
  1704.  CallMath SPCmp
  1705.  seq d0
  1706.  ext.w d0
  1707.  move.w d0,-(sp)
  1708.  jmp (a2)
  1709.  
  1710. NE_DD_D
  1711.  move.l (sp)+,a2
  1712.  movem.l (sp)+,d2/d3
  1713.  movem.l (sp)+,d0/d1
  1714.  CallMathIeeeDoubBas IEEEDPCmp
  1715.  sne d0
  1716.  ext.w d0
  1717.  move.w d0,-(sp)
  1718.  jmp (a2)
  1719.  
  1720. NE_II_I
  1721.  move.l (sp)+,a2
  1722.  move.w (sp)+,d1
  1723.  move.w (sp)+,d0
  1724.  cmp.w d1,d0
  1725.  sne d0
  1726.  ext.w d0
  1727.  move.w d0,-(sp)
  1728.  jmp (a2)
  1729.  
  1730. NE_LL_I
  1731.  move.l (sp)+,a2
  1732.  move.l (sp)+,d1
  1733.  move.l (sp)+,d0
  1734.  cmp.l d0,d1
  1735.  sne d0
  1736.  ext.w d0
  1737.  move.w d0,-(sp)
  1738.  jmp (a2)
  1739.  
  1740. NE_RR_R
  1741.  move.l (sp)+,a2
  1742.  move.l (sp)+,d1
  1743.  move.l (sp)+,d0
  1744.  CallMath SPCmp
  1745.  sne d0
  1746.  ext.w d0
  1747.  move.w d0,-(sp)
  1748.  jmp (a2)
  1749.  
  1750. GT_DD_D
  1751.  move.l (sp)+,a2
  1752.  movem.l (sp)+,d2/d3
  1753.  movem.l (sp)+,d0/d1
  1754.  CallMathIeeeDoubBas IEEEDPCmp
  1755.  sgt d0
  1756.  ext.w d0
  1757.  move.w d0,-(sp)
  1758.  jmp (a2)
  1759.  
  1760. GT_II_I
  1761.  move.l (sp)+,a2
  1762.  move.w (sp)+,d1
  1763.  move.w (sp)+,d0
  1764.  cmp.w d1,d0
  1765.  sgt d0
  1766.  ext.w d0
  1767.  move.w d0,-(sp)
  1768.  jmp (a2)
  1769.  
  1770. GT_LL_I
  1771.  move.l (sp)+,a2
  1772.  move.l (sp)+,d1
  1773.  move.l (sp)+,d0
  1774.  cmp.l d0,d1
  1775.  sgt d0
  1776.  ext.w d0
  1777.  move.w d0,-(sp)
  1778.  jmp (a2)
  1779.  
  1780. GT_RR_R
  1781.  move.l (sp)+,a2
  1782.  move.l (sp)+,d1
  1783.  move.l (sp)+,d0
  1784.  CallMath SPCmp
  1785.  sgt d0
  1786.  ext.w d0
  1787.  move.w d0,-(sp)
  1788.  jmp (a2)
  1789.  
  1790. LT_DD_D
  1791.  move.l (sp)+,a2
  1792.  movem.l (sp)+,d2/d3
  1793.  movem.l (sp)+,d0/d1
  1794.  CallMathIeeeDoubBas IEEEDPCmp
  1795.  slt d0
  1796.  ext.w d0
  1797.  move.w d0,-(sp)
  1798.  jmp (a2)
  1799.  
  1800. LT_II_I
  1801.  move.l (sp)+,a2
  1802.  move.w (sp)+,d1
  1803.  move.w (sp)+,d0
  1804.  cmp.w d1,d0
  1805.  slt d0
  1806.  ext.w d0
  1807.  move.w d0,-(sp)
  1808.  jmp (a2)
  1809.  
  1810. LT_LL_I
  1811.  move.l (sp)+,a2
  1812.  move.l (sp)+,d1
  1813.  move.l (sp)+,d0
  1814.  cmp.l d0,d1
  1815.  slt d0
  1816.  ext.w d0
  1817.  move.w d0,-(sp)
  1818.  jmp (a2)
  1819.  
  1820. LT_RR_R
  1821.  move.l (sp)+,a2
  1822.  move.l (sp)+,d1
  1823.  move.l (sp)+,d0
  1824.  CallMath SPCmp
  1825.  slt d0
  1826.  ext.w d0
  1827.  move.w d0,-(sp)
  1828.  jmp (a2)
  1829.  
  1830. GE_DD_D
  1831.  move.l (sp)+,a2
  1832.  movem.l (sp)+,d2/d3
  1833.  movem.l (sp)+,d0/d1
  1834.  CallMathIeeeDoubBas IEEEDPCmp
  1835.  sge d0
  1836.  ext.w d0
  1837.  move.w d0,-(sp)
  1838.  jmp (a2)
  1839.  
  1840. GE_II_I
  1841.  move.l (sp)+,a2
  1842.  move.w (sp)+,d1
  1843.  move.w (sp)+,d0
  1844.  cmp.w d1,d0
  1845.  sge d0
  1846.  ext.w d0
  1847.  move.w d0,-(sp)
  1848.  jmp (a2)
  1849.  
  1850. GE_LL_I
  1851.  move.l (sp)+,a2
  1852.  move.l (sp)+,d1
  1853.  move.l (sp)+,d0
  1854.  cmp.l d0,d1
  1855.  sge d0
  1856.  ext.w d0
  1857.  move.w d0,-(sp)
  1858.  jmp (a2)
  1859.  
  1860. GE_RR_R
  1861.  move.l (sp)+,a2
  1862.  move.l (sp)+,d1
  1863.  move.l (sp)+,d0
  1864.  CallMath SPCmp
  1865.  sge d0
  1866.  ext.w d0
  1867.  move.w d0,-(sp)
  1868.  jmp (a2)
  1869.  
  1870. LE_DD_D
  1871.  move.l (sp)+,a2
  1872.  movem.l (sp)+,d2/d3
  1873.  movem.l (sp)+,d0/d1
  1874.  CallMathIeeeDoubBas IEEEDPCmp
  1875.  sle d0
  1876.  ext.w d0
  1877.  move.w d0,-(sp)
  1878.  jmp (a2)
  1879.  
  1880. LE_II_I
  1881.  move.l (sp)+,a2
  1882.  move.w (sp)+,d1
  1883.  move.w (sp)+,d0
  1884.  cmp.w d1,d0
  1885.  sle d0
  1886.  ext.w d0
  1887.  move.w d0,-(sp)
  1888.  jmp (a2)
  1889.  
  1890. LE_LL_I
  1891.  move.l (sp)+,a2
  1892.  move.l (sp)+,d1
  1893.  move.l (sp)+,d0
  1894.  cmp.l d0,d1
  1895.  sle d0
  1896.  ext.w d0
  1897.  move.w d0,-(sp)
  1898.  jmp (a2)
  1899.  
  1900. LE_RR_R
  1901.  move.l (sp)+,a2
  1902.  move.l (sp)+,d1
  1903.  move.l (sp)+,d0
  1904.  CallMath SPCmp
  1905.  sle d0
  1906.  ext.w d0
  1907.  move.w d0,-(sp)
  1908.  jmp (a2)
  1909.  
  1910. ABS_D_D
  1911.  movem.l 4(sp),d0/d1
  1912.  CallMathIeeeDoubBas IEEEDPAbs
  1913.  movem.l d0/d1,4(sp)
  1914.  rts
  1915.  
  1916. ABS_I_I
  1917.  move.w 4(sp),d0
  1918.  bpl.s ABS_I_I_Ok
  1919.  neg.w d0
  1920.  bvs ErrorOverflow
  1921.  move.w d0,4(sp)
  1922. ABS_I_I_Ok
  1923.  rts
  1924.  
  1925. ABS_L_L
  1926.  move.l 4(sp),d0
  1927.  bpl.s ABS_L_L_Ok
  1928.  neg.l d0
  1929.  bvs ErrorOverflow
  1930.  move.l d0,4(sp)
  1931. ABS_L_L_Ok
  1932.  rts
  1933.  
  1934. ABS_R_R
  1935.  move.l 4(sp),d0
  1936.  CallMath SPAbs
  1937.  move.l d0,4(sp)
  1938.  rts
  1939.  
  1940. ADD_DD_D
  1941.  move.l (sp)+,a2
  1942.  movem.l (sp)+,d0/d1/d2/d3
  1943.  CallMathIeeeDoubBas IEEEDPAdd
  1944.  bvs ErrorOverflow
  1945.  movem.l d0/d1,-(sp)
  1946.  jmp (a2)
  1947.  
  1948. ADD_II_I
  1949.  move.l (sp)+,a2
  1950.  move.w (sp)+,d0
  1951.  add.w d0,(sp)
  1952.  bvs ErrorOverflow
  1953.  jmp (a2)
  1954.  
  1955. ADD_LL_L
  1956.  move.l (sp)+,a2
  1957.  move.l (sp)+,d0
  1958.  add.l d0,(sp)
  1959.  bvs ErrorOverflow
  1960.  jmp (a2)
  1961.  
  1962. ADD_RR_R
  1963.  move.l (sp)+,a2
  1964.  movem.l (sp)+,d0/d1
  1965.  CallMath SPAdd
  1966.  bvs ErrorOverflow
  1967.  move.l d0,-(sp)
  1968.  jmp (a2)
  1969.  
  1970. AND_II_I
  1971.  move.l (sp)+,a2
  1972.  move.w (sp)+,d0
  1973.  and.w d0,(sp)
  1974.  jmp (a2)
  1975.  
  1976. AND_LL_L
  1977.  move.l (sp)+,a2
  1978.  move.l (sp)+,d0
  1979.  and.l d0,(sp)
  1980.  jmp (a2)
  1981.  
  1982. ATN_D_D
  1983.  movem.l 4(sp),d0/d1
  1984.  CallMathIeeeDoubTrans IEEEDPAtan
  1985.  movem.l d0/d1,4(sp)
  1986.  rts
  1987.  
  1988. ATN_R_R
  1989.  move.l 4(sp),d0
  1990.  CallMathTrans SPAtan
  1991.  move.l d0,4(sp)
  1992.  rts
  1993.  
  1994. COS_D_D
  1995.  movem.l 4(sp),d0/d1
  1996.  CallMathIeeeDoubTrans IEEEDPCos
  1997.  bvs ErrorIllegalFunctionCall
  1998.  movem.l d0/d1,4(sp)
  1999.  rts
  2000.  
  2001. COS_R_R
  2002.  move.l 4(sp),d0
  2003.  CallMathTrans SPCos
  2004.  bvs ErrorIllegalFunctionCall
  2005.  move.l d0,4(sp)
  2006.  rts
  2007.  
  2008. DIV_DD_D
  2009.  move.l (sp)+,a2
  2010.  movem.l (sp)+,d2/d3
  2011.  movem.l (sp)+,d0/d1
  2012.  CallMathIeeeDoubBas IEEEDPDiv
  2013.  bvs ErrorOverflow
  2014.  movem.l d0/d1,-(sp)
  2015.  jmp (a2)
  2016.  
  2017. DIV_II_I
  2018.  move.l (sp)+,a2
  2019.  move.w (sp)+,d1
  2020.  beq ErrorDivisionByZero
  2021.  move.w (sp)+,d0
  2022.  ext.l d0
  2023.  divs d1,d0
  2024.  bvs ErrorOverflow
  2025.  move.w d0,-(sp)
  2026.  jmp (a2)
  2027.  
  2028. DIV_LL_L
  2029.  move.l (sp)+,a2
  2030.  moveq #1,d7
  2031.  move.l (sp)+,d1
  2032.  beq ErrorDivisionByZero
  2033.  bpl.s DIV_LL_L_DivisorPos
  2034.  neg.l d1                    ; Overflow stört nicht
  2035.  moveq #-1,d7
  2036. DIV_LL_L_DivisorPos
  2037.  move.l (sp)+,d0
  2038.  bpl.s DIV_LL_L_DividendPos
  2039.  neg.l d0
  2040.  neg.l d7
  2041. DIV_LL_L_DividendPos
  2042.  bsr ULONGDiv
  2043.  tst.l d7
  2044.  bpl.s DIV_LL_L_NoMakeNeg
  2045.  neg.l d0
  2046.  bvs ErrorOverflow
  2047. DIV_LL_L_NoMakeNeg
  2048.  move.l d0,-(sp)
  2049.  jmp (a2)
  2050.  
  2051. DIV_RR_R
  2052.  move.l (sp)+,a2
  2053.  move.l (sp)+,d1
  2054.  move.l (sp)+,d0
  2055.  CallMath SPDiv
  2056.  bvs ErrorOverflow
  2057.  move.l d0,-(sp)
  2058.  jmp (a2)
  2059.  
  2060. EQV_II_I
  2061.  move.l (sp)+,a2
  2062.  move.w (sp)+,d1
  2063.  move.w (sp)+,d0
  2064.  eor.w d1,d0
  2065.  not.w d0
  2066.  move.w d0,-(sp)
  2067.  jmp (a2)
  2068.  
  2069. EQV_LL_L
  2070.  move.l (sp)+,a2
  2071.  move.l (sp)+,d1
  2072.  move.l (sp)+,d0
  2073.  eor.l d1,d0
  2074.  not.l d0
  2075.  move.l d0,-(sp)
  2076.  jmp (a2)
  2077.  
  2078. EXP_D_D
  2079.  movem.l 4(sp),d0/d1
  2080.  CallMathIeeeDoubTrans IEEEDPExp
  2081.  bvs ErrorOverflow
  2082.  movem.l d0/d1,4(sp)
  2083.  rts
  2084.  
  2085. EXP_R_R
  2086.  move.l 4(sp),d0
  2087.  CallMathTrans SPExp
  2088.  bvs ErrorOverflow
  2089.  move.l d0,4(sp)
  2090.  rts
  2091.  
  2092. FIX_D_D
  2093.  movem.l 4(sp),d0/d1
  2094.  CallMathIeeeDoubBas IEEEDPTst
  2095.  bmi.s FIX_D_D_IsNeg
  2096.  movem.l 4(sp),d0/d1
  2097.  CallMathIeeeDoubBas IEEEDPFloor
  2098.  bra.s FIX_D_D_IsPos
  2099. FIX_D_D_IsNeg
  2100.  movem.l 4(sp),d0/d1
  2101.  CallMathIeeeDoubBas IEEEDPCeil
  2102. FIX_D_D_IsPos
  2103.  movem.l d0/d1,4(sp)
  2104.  rts
  2105.  
  2106. FIX_R_R
  2107.  move.l 4(sp),d1
  2108.  CallMath SPTst
  2109.  bmi.s FIX_R_R_IsNeg
  2110.  move.l 4(sp),d0
  2111.  CallMath SPFloor
  2112.  bra.s FIX_R_R_IsPos
  2113. FIX_R_R_IsNeg
  2114.  move.l 4(sp),d0
  2115.  CallMath SPCeil
  2116. FIX_R_R_IsPos
  2117.  move.l d0,-(sp)
  2118.  rts
  2119.  
  2120. IMP_II_I
  2121.  move.l (sp)+,a2
  2122.  move.w (sp)+,d0
  2123.  not.w d0
  2124.  and.w (sp)+,d0
  2125.  not.w d0
  2126.  move.w d0,-(sp)
  2127.  jmp (a2)
  2128.  
  2129. IMP_LL_L
  2130.  move.l (sp)+,a2
  2131.  move.l (sp)+,d0
  2132.  not.l d0
  2133.  and.l (sp)+,d0
  2134.  not.l d0
  2135.  move.l d0,-(sp)
  2136.  jmp (a2)
  2137.  
  2138. INT_D_D
  2139.  movem.l 4(sp),d0/d1
  2140.  CallMathIeeeDoubBas IEEEDPFloor
  2141.  movem.l d0/d1,4(sp)
  2142.  rts
  2143.  
  2144. INT_R_R
  2145.  move.l 4(sp),d0
  2146.  CallMath SPFloor
  2147.  move.l d0,4(sp)
  2148.  rts
  2149.  
  2150. LOG_D_D
  2151.  movem.l 4(sp),d0/d1
  2152.  CallMathIeeeDoubTrans IEEEDPLog
  2153.  bvs ErrorIllegalFunctionCall
  2154.  movem.l d0/d1,4(sp)
  2155.  rts
  2156.  
  2157. LOG_R_R
  2158.  move.l 4(sp),d0
  2159.  CallMathTrans SPLog
  2160.  bvs ErrorIllegalFunctionCall
  2161.  move.l d0,4(sp)
  2162.  rts
  2163.  
  2164. MOD_II_I
  2165.  move.l (sp)+,a2
  2166.  move.w (sp)+,d1
  2167.  beq ErrorDivisionByZero
  2168.  move.w (sp)+,d0
  2169.  ext.l d0
  2170.  divs d1,d0
  2171.  bvs ErrorOverflow
  2172.  swap d0
  2173.  move.w d0,-(sp)
  2174.  jmp (a2)
  2175.  
  2176. MOD_LL_L
  2177.  move.l (sp)+,a2
  2178.  move.l (sp)+,d1
  2179.  beq ErrorDivisionByZero
  2180.  bpl.s MOD_LL_L_DivisorPos
  2181.  neg.l d1                    ; Overflow stört nicht
  2182. MOD_LL_L_DivisorPos
  2183.  moveq #1,d7
  2184.  move.l (sp)+,d0
  2185.  bpl.s MOD_LL_L_DividendPos
  2186.  neg.l d0
  2187.  moveq #-1,d7
  2188. MOD_LL_L_DividendPos
  2189.  bsr ULONGDiv
  2190.  tst.l d7
  2191.  bpl.s MOD_LL_L_NoMakeNeg
  2192.  neg.l d1
  2193.  bvs ErrorOverflow
  2194. MOD_LL_L_NoMakeNeg
  2195.  move.l d1,-(sp)
  2196.  jmp (a2)
  2197.  
  2198. MUL_DD_D
  2199.  move.l (sp)+,a2
  2200.  movem.l (sp)+,d0/d1/d2/d3
  2201.  CallMathIeeeDoubBas IEEEDPMul
  2202.  bvs ErrorOverflow
  2203.  movem.l d0/d1,-(sp)
  2204.  jmp (a2)
  2205.  
  2206. MUL_II_L
  2207.  move.l (sp)+,a2
  2208.  movem.w (sp)+,d0/d1
  2209.  muls d1,d0
  2210.  move.l d0,-(sp)
  2211.  jmp (a2)
  2212.  
  2213. MUL_LL_L
  2214.  move.l (sp)+,a2
  2215.  moveq #1,d4
  2216.  move.l (sp)+,d0
  2217.  bpl.s MUL_LL_L_D0Pos
  2218.  moveq #-1,d4
  2219. MUL_LL_L_D0Pos
  2220.  move.l (sp)+,d1
  2221.  bpl.s MUL_LL_L_D1Pos
  2222.  neg.l d4
  2223. MUL_LL_L_D1Pos
  2224.  moveq #0,d2
  2225.  moveq #31,d3
  2226. MUL_LL_L_Loop
  2227.  lsl.l #1,d2
  2228.  bcs ErrorOverflow
  2229.  lsl.l #1,d0
  2230.  bcc.s MUL_LL_L_CNotSet
  2231.  add.l d1,d2
  2232.  bvs ErrorOverflow
  2233. MUL_LL_L_CNotSet
  2234.  dbra d3,MUL_LL_L_Loop
  2235.  tst.l d2
  2236.  bmi ErrorOverflow
  2237.  tst.l d4
  2238.  bpl.s MUL_LL_L_IsPos
  2239.  neg.l d2
  2240. MUL_LL_L_IsPos
  2241.  move.l d2,-(sp)
  2242.  jmp (a2)
  2243.  
  2244. MUL_RR_R
  2245.  move.l (sp)+,a2
  2246.  movem.l (sp)+,d0/d1
  2247.  CallMath SPMul
  2248.  bvs ErrorOverflow
  2249.  move.l d0,-(sp)
  2250.  jmp (a2)
  2251.  
  2252. NEG_D_D
  2253.  movem.l 4(sp),d0/d1
  2254.  CallMathIeeeDoubBas IEEEDPNeg
  2255.  movem.l d0/d1,4(sp)
  2256.  rts
  2257.  
  2258. NEG_I_I
  2259.  move.w 4(sp),d0
  2260.  neg.w d0
  2261.  bvs ErrorOverflow
  2262.  move.w d0,4(sp)
  2263.  rts
  2264.  
  2265. NEG_L_L
  2266.  move.l 4(sp),d0
  2267.  neg.l d0
  2268.  bvs ErrorOverflow
  2269.  move.l d0,4(sp)
  2270.  rts
  2271.  
  2272. NEG_R_R
  2273.  move.l 4(sp),d0
  2274.  CallMath SPNeg
  2275.  move.l d0,4(sp)
  2276.  rts
  2277.  
  2278. NOT_I_I
  2279.  move.w 4(sp),d0
  2280.  not.w d0
  2281.  move.w d0,4(sp)
  2282.  rts
  2283.  
  2284. NOT_L_L
  2285.  move.l 4(sp),d0
  2286.  not.l d0
  2287.  move.l d0,4(sp)
  2288.  rts
  2289.  
  2290. OR_II_I
  2291.  move.l (sp)+,a2
  2292.  move.w (sp)+,d0
  2293.  or.w d0,(sp)
  2294.  jmp (a2)
  2295.  
  2296. OR_LL_L
  2297.  move.l (sp)+,a2
  2298.  move.l (sp)+,d0
  2299.  or.l d0,(sp)
  2300.  jmp (a2)
  2301.  
  2302. POT_DD_D
  2303.  move.l (sp)+,a2
  2304.  movem.l (sp)+,d2/d3
  2305.  movem.l (sp)+,d0/d1
  2306.  CallMathIeeeDoubTrans IEEEDPPow
  2307.  bvs ErrorOverflow
  2308.  movem.l d0/d1,-(sp)
  2309.  jmp (a2)
  2310.  
  2311. POT_RR_R
  2312.  move.l (sp)+,a2
  2313.  move.l (sp)+,d1
  2314.  move.l (sp)+,d0
  2315.  CallMathTrans SPPow
  2316.  bvs ErrorOverflow
  2317.  move.l d0,-(sp)
  2318.  jmp (a2)
  2319.  
  2320. SGN_D_I
  2321.  move.l (sp)+,a2
  2322.  movem.l (sp)+,d0/d1
  2323.  CallMathIeeeDoubBas IEEEDPTst
  2324.  move.w d0,-(sp)
  2325.  jmp (a2)
  2326.  
  2327. SGN_I_I
  2328.  move.l (sp)+,a2
  2329.  move.w (sp)+,d0
  2330. SGN_I_I_SetFlag
  2331.  bmi.s SGN_I_I_IsNeg
  2332.  beq.s SGN_I_I_IsZero
  2333.  move.w #1,-(sp)
  2334.  jmp (a2)
  2335. SGN_I_I_IsNeg
  2336.  move.w #-1,-(sp)
  2337.  jmp (a2)
  2338. SGN_I_I_IsZero
  2339.  clr.w -(sp)
  2340.  jmp (a2)
  2341.  
  2342. SGN_L_I
  2343.  move.l (sp)+,a2
  2344.  move.l (sp)+,d0
  2345.  bra SGN_I_I_SetFlag
  2346.  
  2347. SGN_R_I
  2348.  move.l (sp)+,a2
  2349.  move.l (sp)+,d1
  2350.  CallMath SPTst
  2351.  move.w d0,-(sp)
  2352.  jmp (a2)
  2353.  
  2354. SIN_D_D
  2355.  movem.l 4(sp),d0/d1
  2356.  CallMathIeeeDoubTrans IEEEDPSin
  2357.  bvs ErrorIllegalFunctionCall
  2358.  movem.l d0/d1,4(sp)
  2359.  rts
  2360.  
  2361. SIN_R_R
  2362.  move.l 4(sp),d0
  2363.  CallMathTrans SPSin
  2364.  bvs ErrorIllegalFunctionCall
  2365.  move.l d0,4(sp)
  2366.  rts
  2367.  
  2368. SQR_D_D
  2369.  movem.l 4(sp),d0/d1
  2370.  CallMathIeeeDoubTrans IEEEDPSqrt
  2371.  bvs ErrorIllegalFunctionCall
  2372.  movem.l d0/d1,4(sp)
  2373.  rts
  2374.  
  2375. SQR_L_I
  2376.  move.l (sp)+,a2
  2377.  move.l (sp)+,d0
  2378.  bmi ErrorIllegalFunctionCall
  2379.  moveq #0,d1
  2380.  moveq #15,d2
  2381.  moveq #0,d3
  2382. SQR_L_I_Loop
  2383.  lsl.l #1,d0
  2384.  roxl.l #1,d1
  2385.  lsl.l #1,d0
  2386.  roxl.l #1,d1
  2387.  lsl.l #2,d3
  2388.  addq.w #1,d3
  2389.  cmp.l d1,d3
  2390.  bgt.s SQR_L_I_DoZero
  2391.  sub.l d3,d1
  2392.  addq.w #2,d3
  2393. SQR_L_I_DoZero
  2394.  lsr.l #1,d3
  2395.  dbra d2,SQR_L_I_Loop
  2396.  move.w d3,-(sp)
  2397.  jmp (a2)
  2398.  
  2399. SQR_R_R
  2400.  move.l 4(sp),d0
  2401.  CallMathTrans SPSqrt
  2402.  bvs ErrorIllegalFunctionCall
  2403.  move.l d0,4(sp)
  2404.  rts
  2405.  
  2406. SUB_DD_D
  2407.  move.l (sp)+,a2
  2408.  movem.l (sp)+,d2/d3
  2409.  movem.l (sp)+,d0/d1
  2410.  CallMathIeeeDoubBas IEEEDPSub
  2411.  bvs ErrorOverflow
  2412.  movem.l d0/d1,-(sp)
  2413.  jmp (a2)
  2414.  
  2415. SUB_II_I
  2416.  move.l (sp)+,a2
  2417.  move.w (sp)+,d0
  2418.  sub.w d0,(sp)
  2419.  bvs ErrorOverflow
  2420.  jmp (a2)
  2421.  
  2422. SUB_LL_L
  2423.  move.l (sp)+,a2
  2424.  move.l (sp)+,d0
  2425.  sub.l d0,(sp)
  2426.  bvs ErrorOverflow
  2427.  jmp (a2)
  2428.  
  2429. SUB_RR_R
  2430.  move.l (sp)+,a2
  2431.  move.l (sp)+,d1
  2432.  move.l (sp)+,d0
  2433.  CallMath SPSub
  2434.  bvs ErrorOverflow
  2435.  move.l d0,-(sp)
  2436.  jmp (a2)
  2437.  
  2438. TAN_D_D
  2439.  movem.l 4(sp),d0/d1
  2440.  CallMathIeeeDoubTrans IEEEDPTan
  2441.  bvs ErrorIllegalFunctionCall
  2442.  movem.l d0/d1,4(sp)
  2443.  rts
  2444.  
  2445. TAN_R_R
  2446.  move.l 4(sp),d0
  2447.  CallMathTrans SPTan
  2448.  bvs ErrorIllegalFunctionCall
  2449.  move.l d0,4(sp)
  2450.  rts
  2451.  
  2452. XOR_II_I
  2453.  move.l (sp)+,a2
  2454.  move.w (sp)+,d0
  2455.  eor.w d0,(sp)
  2456.  jmp (a2)
  2457.  
  2458. XOR_LL_L
  2459.  move.l (sp)+,a2
  2460.  move.l (sp)+,d0
  2461.  eor.l d0,(sp)
  2462.  jmp (a2)
  2463.  
  2464. ; **********************************************************************
  2465. ; *                                                                    *
  2466. ; * BASIC-Funktionen                                                   *
  2467. ; *                                                                    *
  2468. ; **********************************************************************
  2469.  
  2470. COLLISION_I_I
  2471.  bra ErrorAdvancedFeature
  2472.  
  2473. CSRLIN__I
  2474.  move.l (sp)+,a2
  2475.  Break_Off
  2476.  move.w #1,-(sp)
  2477.  tst.l OutputFenster(a5)
  2478.  beq.s CSRLIN__I_NoFenster
  2479.  move.l OutputFenster(a5),a0
  2480.  move.l FENSTER_CONSOLEWRITE(a0),a0
  2481.  move.l IO_UNIT(a0),a0
  2482.  move.w cu_YCCP(a0),(sp)
  2483.  addq.w #1,(sp)
  2484. CSRLIN__I_NoFenster
  2485.  Break_On
  2486.  jmp (a2)
  2487.  
  2488. DATE__T
  2489.  bra ErrorAdvancedFeature
  2490.  
  2491. ERL__I
  2492.  bra ErrorAdvancedFeature
  2493.  
  2494. ERR__I
  2495.  bra ErrorAdvancedFeature
  2496.  
  2497. FRE_I_L
  2498.  bra ErrorAdvancedFeature
  2499.  
  2500. IF_IDD_D
  2501.  move.l (sp)+,a2
  2502.  movem.l (sp)+,d0/d1/d2/d3
  2503.  tst.w (sp)+
  2504.  beq IF_IDD_D_False
  2505.  movem.l d2/d3,-(sp)
  2506.  jmp (a2)
  2507. IF_IDD_D_False
  2508.  movem.l d0/d1,-(sp)
  2509.  jmp (a2)
  2510.  
  2511. IF_III_I
  2512.  move.l (sp)+,a2
  2513.  movem.w (sp)+,d0/d1
  2514.  tst.w (sp)+
  2515.  beq.s IF_III_I_False
  2516.  move.w d1,-(sp)
  2517.  jmp (a2)
  2518. IF_III_I_False
  2519.  move.w d0,-(sp)
  2520.  jmp (a2)
  2521.  
  2522. IF_ILL_L
  2523.  movem.l (sp)+,a0/a1/a2
  2524.  tst.w (sp)+
  2525.  beq.s IF_ILL_L_False
  2526.  move.l a2,-(sp)
  2527.  jmp (a0)
  2528. IF_ILL_L_False
  2529.  move.l a1,-(sp)
  2530.  jmp (a0)
  2531.  
  2532. IF_IRR_R EQU IF_ILL_L
  2533. IF_ITT_T EQU IF_ILL_L
  2534.  
  2535. INKEY__T
  2536.  move.l (sp)+,a2
  2537.  moveq #0,d0
  2538.  bsr GetOneChar
  2539.  tst.l d0
  2540.  bmi.s InkeyReturnEmptyString
  2541.  move.w #1,a3
  2542.  bsr CreateString
  2543.  move.l a3,-(sp)
  2544.  move.l (a3),a0
  2545.  move.w #1,(a0)+
  2546.  move.b d0,(a0)
  2547.  bsr FinishString
  2548.  jmp (a2)
  2549. InkeyReturnEmptyString
  2550.  pea LeerString
  2551.  jmp (a2)
  2552.  
  2553. LOC_I_L
  2554.  bra ErrorAdvancedFeature
  2555.  
  2556. LPOS_I_I
  2557.  bra ErrorAdvancedFeature
  2558.  
  2559. MENU_I_I
  2560.  bra ErrorAdvancedFeature
  2561.  
  2562. MOUSE_I_I
  2563.  bra ErrorAdvancedFeature
  2564.  
  2565. OBJECT.VX_I_I
  2566.  bra ErrorAdvancedFeature
  2567.  
  2568. OBJECT.VY_I_I
  2569.  bra ErrorAdvancedFeature
  2570.  
  2571. PEEKL_L_L
  2572.  movem.l (sp)+,a0/a1
  2573.  move.l a1,d0
  2574.  btst #0,d0
  2575.  bne ErrorIllegalFunctionCall
  2576.  move.l (a1),-(sp)
  2577.  jmp (a0)
  2578.  
  2579. PEEKW_L_I
  2580.  movem.l (sp)+,a0/a1
  2581.  move.l a1,d0
  2582.  btst #0,d0
  2583.  bne ErrorIllegalFunctionCall
  2584.  move.w (a1),-(sp)
  2585.  jmp (a0)
  2586.  
  2587. PEEK_L_I
  2588.  movem.l (sp)+,a0/a1
  2589.  move.b (a1),d0
  2590.  ext.w d0
  2591.  move.w d0,-(sp)
  2592.  jmp (a0)
  2593.  
  2594. POS_I_I
  2595.  Break_Off
  2596.  move.w #1,4(sp)
  2597.  tst.l OutputFenster(a5)
  2598.  beq.s POS_I_I_NoFenster
  2599.  move.l OutputFenster(a5),a0
  2600.  move.l FENSTER_CONSOLEWRITE(a0),a0
  2601.  move.l IO_UNIT(a0),a0
  2602.  move.w cu_XCCP(a0),4(sp)
  2603.  addq.w #1,4(sp)
  2604. POS_I_I_NoFenster
  2605.  Break_On
  2606.  rts
  2607.  
  2608. RND_I_R
  2609.  bra ErrorAdvancedFeature
  2610.  
  2611. RND__R
  2612.  bra ErrorAdvancedFeature
  2613.  
  2614. STICK_I_I
  2615.  bra ErrorAdvancedFeature
  2616.  
  2617. STRIG_I_I
  2618.  bra ErrorAdvancedFeature
  2619.  
  2620. TIMER__L
  2621.  Break_Off
  2622.  lea Seconds(a5),a0
  2623.  lea Micros(a5),a1
  2624.  CallIntuition CurrentTime
  2625.  move.l Seconds(a5),d0
  2626.  move.l #24*60*60,d1
  2627.  bsr ULONGDiv
  2628.  move.l (sp)+,a2
  2629.  move.l d1,-(sp)
  2630.  Break_On
  2631.  jmp (a2)
  2632.  
  2633. TIME__T
  2634.  bra ErrorAdvancedFeature
  2635.  
  2636. WINDOW_I_L
  2637.  bra ErrorAdvancedFeature
  2638.  
  2639. ; **********************************************************************
  2640. ; *                                                                    *
  2641. ; * Einfache Funktionen zur Unterstützung der BASIC-Anweisungen/Funkt. *
  2642. ; *                                                                    *
  2643. ; **********************************************************************
  2644.  
  2645. DOUBLE_D_DD
  2646.  move.l (sp)+,a2
  2647.  movem.l (sp),d0/d1
  2648.  movem.l d0/d1,-(sp)
  2649.  jmp (a2)
  2650.  
  2651. DOUBLE_I_II
  2652.  move.l (sp)+,a2
  2653.  move.w (sp),-(sp)
  2654.  jmp (a2)
  2655.  
  2656. DOUBLE_L_LL
  2657.  move.l (sp)+,a2
  2658.  move.l (sp),-(sp)
  2659.  jmp (a2)
  2660.  
  2661. DOUBLE_R_RR EQU DOUBLE_L_LL
  2662.  
  2663. DOUBLE_T_TT EQU DOUBLE_L_LL
  2664.  
  2665. FORGET_D_
  2666.  move.l (sp)+,a2
  2667.  addq.l #8,sp
  2668.  jmp (a2)
  2669.  
  2670. FORGET_I_
  2671.  move.l (sp)+,a2
  2672.  addq.l #2,sp
  2673.  jmp (a2)
  2674.  
  2675. FORGET_L_
  2676.  move.l (sp)+,a2
  2677.  addq.l #4,sp
  2678.  jmp (a2)
  2679.  
  2680. FORGET_R_ EQU FORGET_L_
  2681.  
  2682. FORGET_T_ EQU FORGET_L_
  2683.  
  2684. ; **********************************************************************
  2685. ; *                                                                    *
  2686. ; * Alle BASIC-Befehle                                                 *
  2687. ; *                                                                    *
  2688. ; **********************************************************************
  2689.  
  2690. AREAFILL_I_
  2691.  bra ErrorAdvancedFeature
  2692.  
  2693. AREAFILL__
  2694.  bra ErrorAdvancedFeature
  2695.  
  2696. AREA_II_
  2697.  bra ErrorAdvancedFeature
  2698.  
  2699. BEEP__
  2700.  Break_Off
  2701.  sub.l a0,a0
  2702.  CallIntuition DisplayBeep
  2703.  Break_On
  2704.  rts
  2705.  
  2706. BREAKOFF__
  2707.  bra ErrorAdvancedFeature
  2708.  
  2709. BREAKON__
  2710.  bra ErrorAdvancedFeature
  2711.  
  2712. BREAKSTOP__
  2713.  bra ErrorAdvancedFeature
  2714.  
  2715. CALL_Z_
  2716.  moveq #6,d0
  2717.  bsr TestStackMem
  2718.  move.l StackPointer(a5),a3
  2719.  move.l (sp)+,(a3)+
  2720.  move.w #STACK_CALL,(a3)+
  2721.  move.l a3,StackPointer(a5)
  2722.  rts
  2723.  
  2724. CHECKINPUTEND__
  2725.  bra ErrorAdvancedFeature
  2726.  
  2727. CIRCLE_IIIIRRR_
  2728.  bra ErrorAdvancedFeature
  2729.  
  2730. CIRCLE_IIIIRR_
  2731.  bra ErrorAdvancedFeature
  2732.  
  2733. CIRCLE_IIII_
  2734.  bra ErrorAdvancedFeature
  2735.  
  2736. CIRCLE_III_
  2737.  bra ErrorAdvancedFeature
  2738.  
  2739. CLEAR__
  2740.  bra ErrorAdvancedFeature
  2741.  
  2742. CLS__
  2743.  Break_Off
  2744.  tst.l OutputFenster(a5)
  2745.  beq.s CLS___NoFenster
  2746.  moveq #0,d0
  2747.  move.l OutputFenster(a5),a1
  2748.  move.l FENSTER_WINDOW(a1),a1
  2749.  move.l wd_RPort(a1),a1
  2750.  CallGfx SetRast
  2751.  move.w #1,-(sp)
  2752.  bsr LOCATEX_I_
  2753.  move.w #1,-(sp)
  2754.  bsr LOCATEY_I_
  2755. CLS___NoFenster
  2756.  Break_On
  2757.  rts
  2758.  
  2759. COLLISIONOFF__
  2760.  bra ErrorAdvancedFeature
  2761.  
  2762. COLLISIONON__
  2763.  bra ErrorAdvancedFeature
  2764.  
  2765. COLLISIONSTOP__
  2766.  bra ErrorAdvancedFeature
  2767.  
  2768. COLOR1_I_
  2769.  bra ErrorAdvancedFeature
  2770.  
  2771. COLOR2_I_
  2772.  bra ErrorAdvancedFeature
  2773.  
  2774. SUB_II_
  2775. ; Stackbereich berechnen und testen
  2776.  moveq #SUBSTACK_VARTAB,d0
  2777.  add.w 4(sp),d0
  2778.  move.l d0,d7      ; Zeiger auf Stringsvars
  2779.  add.l StackPointer(a5),d7
  2780.  add.w 6(sp),d0
  2781.  addq.l #6,d0      ; +STACK_SUB+Größe des benutzten Speichers
  2782.  bsr TestStackMem
  2783. ; StackPointer holen und verändern
  2784.  move.l StackPointer(a5),a3
  2785.  add.l d0,StackPointer(a5)
  2786. ; ganz nach oben die Größe des Speichers
  2787.  move.l d0,-6(a3,d0.l)
  2788.  move.w #STACK_SUB,-2(a3,d0.l)
  2789. ; SUBSTACK-Struktur füllen
  2790.  move.l FirstLocalField(a5),(a3)+      ; SUBSTACK_OLDFIRSTLOCALFIELD
  2791.  move.l a4,(a3)+   ; SUBSTACK_OLDA4
  2792.  move.l a3,a0
  2793.  clr.l (a3)+       ; FIELD_NEXT
  2794.  clr.l (a3)+       ; FIELD_TEXTPRED
  2795.  clr.l (a3)+       ; FIELD_TEXTSUCC
  2796.  move.l d7,(a3)+   ; FIELD_MEM
  2797.  clr.w (a3)+       ; FIELD_MEMSIZE
  2798.  move.w 6(sp),(a3)+
  2799.  bsr AddTextField
  2800.  move.w 4(sp),d1
  2801.  bra.s SUB_II__EnterClearNumVarsLoop
  2802. SUB_II__ClearNumVarsLoop
  2803.  clr.b (a3)+
  2804. SUB_II__EnterClearNumVarsLoop
  2805.  dbra d1,SUB_II__ClearNumVarsLoop
  2806.  move.w 6(sp),d1
  2807.  lsr.w #2,d1
  2808.  lea NullWord(pc),a0
  2809.  bra.s SUB_II__EnterClearTextVarsLoop
  2810. SUB_II__ClearTextVarsLoop
  2811.  move.l a0,(a3)+
  2812. SUB_II__EnterClearTextVarsLoop
  2813.  dbra d1,SUB_II__ClearTextVarsLoop
  2814. ; a4 neu setzen
  2815.  move.l a3,a4
  2816. ; Fertig
  2817.  move.l (sp)+,a2
  2818.  addq.l #4,sp
  2819.  jmp (a2)
  2820.  
  2821. ENDSUB__
  2822.  move.l StackPointer(a5),a3
  2823. ENDSUB___SkipReturnsLoop
  2824.  cmp.w #STACK_SUB,-2(a3)
  2825.  beq.s ENDSUB___FoundStackSub
  2826.  subq.l #6,a3
  2827.  bra.s ENDSUB___SkipReturnsLoop
  2828. ENDSUB___FoundStackSub
  2829.  move.l -6(a3),d0
  2830.  sub.l d0,a3
  2831.  move.l SUBSTACK_OLDFIRSTLOCALFIELD(a3),FirstLocalField(a5)
  2832.  move.l SUBSTACK_OLDA4(a3),a4
  2833.  lea SUBSTACK_TEXTFIELD(a3),a0
  2834.  clr.l FIELD_MEM(a0)
  2835.  clr.l FIELD_MEMSIZE(a0)
  2836.  bsr FreeFieldList
  2837.  subq.l #2,a3
  2838.  move.l -(a3),(sp)
  2839.  move.l a3,StackPointer(a5)
  2840.  rts
  2841.  
  2842. ERASE_f_
  2843.  bra ErrorAdvancedFeature
  2844.  
  2845. ERROR_L_
  2846.  bra ErrorAdvancedFeature
  2847.  
  2848. EXITSUB__
  2849.  bra ErrorAdvancedFeature
  2850.  
  2851. FRONTCOLOR__I
  2852.  bra ErrorAdvancedFeature
  2853.  
  2854. GETCOLOR0__I
  2855.  bra ErrorAdvancedFeature
  2856.  
  2857. GETINPUTPART__T
  2858.  bra ErrorAdvancedFeature
  2859.  
  2860. GETWINDOWSIZE__II
  2861.  bra ErrorAdvancedFeature
  2862.  
  2863. GFXSTEP_II_II
  2864.  bra ErrorAdvancedFeature
  2865.  
  2866. GOSUB_Z_
  2867.  moveq #6,d0
  2868.  bsr TestStackMem
  2869.  move.l StackPointer(a5),a3
  2870.  move.l (sp)+,(a3)+
  2871.  move.w #STACK_GOSUB,(a3)+
  2872.  move.l a3,StackPointer(a5)
  2873.  rts
  2874.  
  2875. GOTO_Z_
  2876.  addq.l #4,sp
  2877.  rts
  2878.  
  2879. IF_IZ_
  2880.  movem.l (sp)+,a0/a1
  2881.  tst.w (sp)+
  2882.  beq.s IF_IZ__False
  2883.  jmp (a0)
  2884. IF_IZ__False
  2885.  jmp (a1)
  2886.  
  2887. INPUT__
  2888.  bra ErrorAdvancedFeature
  2889.  
  2890. LIBRARYCLOSE__
  2891.  bra ErrorAdvancedFeature
  2892.  
  2893. LIBRARY_T_
  2894.  bra ErrorAdvancedFeature
  2895.  
  2896. LINEBF_IIIII_
  2897.  bra ErrorAdvancedFeature
  2898.  
  2899. LINEB_IIIII_
  2900.  bra ErrorAdvancedFeature
  2901.  
  2902. LINEINPUT__T
  2903.  bsr CursorOn
  2904.  move.w #MAXLINEINPUTLEN,a3
  2905.  bsr CreateString
  2906.  move.l (sp)+,a2
  2907.  move.l a3,-(sp)
  2908.  move.l a2,-(sp)
  2909.  move.l (a3),a0
  2910.  move.l a0,a1
  2911.  clr.w (a1)+
  2912. LINEINPUT__T_Loop
  2913.  moveq #-1,d0
  2914.  bsr GetOneChar
  2915.  cmp.b #13,d0
  2916.  beq.s LINEINPUT__T_EndOfLineInput
  2917.  cmp.b #8,d0
  2918.  bne.s LINEINPUT__T_NoBackSpace        ; BackSpace
  2919.  tst.w (a0)
  2920.  beq.s LINEINPUT__T_Loop
  2921.  subq.w #1,(a0)
  2922.  subq.l #1,a1
  2923.  movem.l a0/a1,-(sp)
  2924.  pea DeleteLeftText
  2925.  bsr PRINT_T_
  2926.  movem.l (sp)+,a0/a1
  2927.  bra.s LINEINPUT__T_Loop
  2928. LINEINPUT__T_NoBackSpace
  2929.  move.b d0,d1
  2930.  and.b #$7f,d1               ; SteuerCode?
  2931.  cmp.b #$20,d1
  2932.  blt.s LINEINPUT__T_Loop
  2933.  move.w (a0),d1
  2934.  cmp.w #MAXLINEINPUTLEN,d1
  2935.  bhi.s LINEINPUT__T_Loop
  2936.  move.b d0,(a1)+
  2937.  addq.w #1,(a0)
  2938.  movem.l a0/a1,-(sp)
  2939.  lsl.w #8,d0
  2940.  move.w d0,-(sp)
  2941.  move.w #1,-(sp)
  2942.  move.l sp,-(sp)
  2943.  move.l sp,-(sp)
  2944.  bsr PRINT_T_
  2945.  addq.l #8,sp
  2946.  movem.l (sp)+,a0/a1
  2947.  bra LINEINPUT__T_Loop
  2948. LINEINPUT__T_EndOfLineInput
  2949.  bsr FinishString
  2950.  bsr CursorOff
  2951.  bra PRINTRETURN__
  2952.  
  2953. LINE_IIIII_
  2954.  bra ErrorAdvancedFeature
  2955.  
  2956. LOCATEX_I_
  2957.  bsr CSRLIN__I
  2958.  move.w (sp)+,d1
  2959.  move.l (sp)+,a2
  2960.  move.w d1,-(sp)
  2961.  move.l a2,-(sp)
  2962.  bra LOCATEXY_II_
  2963.  
  2964. LOCATEY_I_
  2965.  clr.w -(sp)
  2966.  bsr POS_I_I
  2967.  move.w (sp)+,d0
  2968.  move.l (sp)+,a2
  2969.  move.w (sp)+,d1
  2970.  move.w d0,-(sp)
  2971.  move.w d1,-(sp)
  2972.  move.l a2,-(sp)
  2973.  bra LOCATEXY_II_
  2974.  
  2975. LOCATEXY_II_
  2976.  move.l FreeStringPointer(a5),a3
  2977.  move.l a3,a1
  2978.  move.l (sp)+,a2
  2979.  move.l (sp)+,(a3)+
  2980.  move.l a2,-(sp)
  2981.  addq.l #4,a3
  2982.  move.l a3,-4(a3)
  2983.  pea -4(a3)
  2984.  addq.l #2,a3
  2985.  lea LOCATEY_I_FormatString,a0
  2986.  lea RawDoFmtProc,a2
  2987.  CallSys RawDoFmt
  2988.  move.l (sp),a0
  2989.  move.l (a0),a0
  2990.  move.l a0,a1
  2991.  move.w #-1,(a1)+
  2992. LOCATEY_I_Loop
  2993.  addq.w #1,(a0)
  2994.  tst.b (a1)+
  2995.  bne.s LOCATEY_I_Loop
  2996.  bsr PRINT_T_
  2997.  rts
  2998. LOCATEY_I_FormatString
  2999.  dc.b $9b,"%d;%dH",0
  3000.  even
  3001.  
  3002. LPRINTRETURN__
  3003.  bra ErrorAdvancedFeature
  3004.  
  3005. LPRINTTAB__
  3006.  bra ErrorAdvancedFeature
  3007.  
  3008. LPRINT_D_
  3009.  bra ErrorAdvancedFeature
  3010.  
  3011. LPRINT_I_
  3012.  bra ErrorAdvancedFeature
  3013.  
  3014. LPRINT_L_
  3015.  bra ErrorAdvancedFeature
  3016.  
  3017. LPRINT_R_
  3018.  bra ErrorAdvancedFeature
  3019.  
  3020. LPRINT_T_
  3021.  bra ErrorAdvancedFeature
  3022.  
  3023. MENUOFF__
  3024.  bra ErrorAdvancedFeature
  3025.  
  3026. MENUON__
  3027.  bra ErrorAdvancedFeature
  3028.  
  3029. MENURESET__
  3030.  bra ErrorAdvancedFeature
  3031.  
  3032. MENUSTOP__
  3033.  bra ErrorAdvancedFeature
  3034.  
  3035. MENU_IIIT_
  3036.  bra ErrorAdvancedFeature
  3037.  
  3038. MENU_III_
  3039.  bra ErrorAdvancedFeature
  3040.  
  3041. MOUSEOFF__
  3042.  bra ErrorAdvancedFeature
  3043.  
  3044. MOUSEON__
  3045.  bra ErrorAdvancedFeature
  3046.  
  3047. MOUSESTOP__
  3048.  bra ErrorAdvancedFeature
  3049.  
  3050. NEXT_DDDZ_
  3051.  movem.l (sp)+,a2/a3
  3052.  movem.l (sp)+,d0/d1/d2/d3/d4/d5
  3053.  CallMathIeeeDoubBas IEEEDPTst
  3054.  beq.s NEXT_DDDZ_DoLoop
  3055.  bmi.s NEXT_DDDZ_IsNeg
  3056.  move.l d4,d0
  3057.  move.l d5,d1
  3058.  CallMathIeeeDoubBas IEEEDPCmp
  3059.  bgt.s NEXT_DDDZ_LeaveLoop
  3060.  jmp (a3)
  3061. NEXT_DDDZ_IsNeg
  3062.  move.l d4,d0
  3063.  move.l d5,d1
  3064.  CallMathIeeeDoubBas IEEEDPCmp
  3065.  bge.s NEXT_DDDZ_DoLoop
  3066. NEXT_DDDZ_LeaveLoop
  3067.  jmp (a2)
  3068. NEXT_DDDZ_DoLoop
  3069.  jmp (a3)
  3070.  
  3071. NEXT_IIIZ_
  3072.  movem.l (sp)+,a2/a3
  3073.  movem.w (sp)+,d0/d1/d2
  3074.  tst.w d0
  3075.  beq.s NEXT_IIIZ_DoLoop
  3076.  bmi.s NEXT_IIIZ_IsNeg
  3077.  cmp.w d1,d2
  3078.  bgt.s NEXT_IIIZ_LeaveLoop
  3079.  jmp (a3)
  3080. NEXT_IIIZ_IsNeg
  3081.  cmp.w d1,d2
  3082.  bge.s NEXT_IIIZ_DoLoop
  3083. NEXT_IIIZ_LeaveLoop
  3084.  jmp (a2)
  3085. NEXT_IIIZ_DoLoop
  3086.  jmp (a3)
  3087.  
  3088. NEXT_LLLZ_
  3089.  movem.l (sp)+,a2/a3
  3090.  movem.l (sp)+,d0/d1/d2
  3091.  tst.l d0
  3092.  beq.s NEXT_LLLZ_DoLoop
  3093.  bmi.s NEXT_LLLZ_IsNeg
  3094.  cmp.l d1,d2
  3095.  bgt.s NEXT_LLLZ_LeaveLoop
  3096.  jmp (a3)
  3097. NEXT_LLLZ_IsNeg
  3098.  cmp.l d1,d2
  3099.  bge.s NEXT_LLLZ_DoLoop
  3100. NEXT_LLLZ_LeaveLoop
  3101.  jmp (a2)
  3102. NEXT_LLLZ_DoLoop
  3103.  jmp (a3)
  3104.  
  3105. NEXT_RRRZ_
  3106.  movem.l (sp)+,a2/a3
  3107.  movem.l (sp)+,d1/d2/d3
  3108.  CallMath SPTst
  3109.  beq.s NEXT_RRRZ_DoLoop
  3110.  bmi.s NEXT_RRRZ_IsNeg
  3111.  move.l d3,d0
  3112.  move.l d2,d1
  3113.  CallMath SPCmp
  3114.  bgt.s NEXT_RRRZ_LeaveLoop
  3115.  jmp (a3)
  3116. NEXT_RRRZ_IsNeg
  3117.  move.l d3,d0
  3118.  move.l d2,d1
  3119.  CallMath SPCmp
  3120.  bge.s NEXT_RRRZ_DoLoop
  3121. NEXT_RRRZ_LeaveLoop
  3122.  jmp (a2)
  3123. NEXT_RRRZ_DoLoop
  3124.  jmp (a3)
  3125.  
  3126. OBJECT.AX_II_
  3127.  bra ErrorAdvancedFeature
  3128.  
  3129. OBJECT.AY_II_
  3130.  bra ErrorAdvancedFeature
  3131.  
  3132. OBJECT.CLIP_IIII_
  3133.  bra ErrorAdvancedFeature
  3134.  
  3135. OBJECT.CLOSE__
  3136.  bra ErrorAdvancedFeature
  3137.  
  3138. OBJECT.CLOSE_I_
  3139.  bra ErrorAdvancedFeature
  3140.  
  3141. OBJECT.HIT1_II_I
  3142.  bra ErrorAdvancedFeature
  3143.  
  3144. OBJECT.HIT2_II_I
  3145.  bra ErrorAdvancedFeature
  3146.  
  3147. OBJECT.OFF_I_
  3148.  bra ErrorAdvancedFeature
  3149.  
  3150. OBJECT.OFF__
  3151.  bra ErrorAdvancedFeature
  3152.  
  3153. OBJECT.ON_I_
  3154.  bra ErrorAdvancedFeature
  3155.  
  3156. OBJECT.ON__
  3157.  bra ErrorAdvancedFeature
  3158.  
  3159. OBJECT.PLANES1_II_I
  3160.  bra ErrorAdvancedFeature
  3161.  
  3162. OBJECT.PLANES2_II_I
  3163.  bra ErrorAdvancedFeature
  3164.  
  3165. OBJECT.PRIORITY_II_
  3166.  bra ErrorAdvancedFeature
  3167.  
  3168. OBJECT.SHAPE_II_
  3169.  bra ErrorAdvancedFeature
  3170.  
  3171. OBJECT.SHAPE_IT_
  3172.  bra ErrorAdvancedFeature
  3173.  
  3174. OBJECT.START__
  3175.  bra ErrorAdvancedFeature
  3176.  
  3177. OBJECT.START_I_
  3178.  bra ErrorAdvancedFeature
  3179.  
  3180. OBJECT.STOP__
  3181.  bra ErrorAdvancedFeature
  3182.  
  3183. OBJECT.STOP_I_
  3184.  bra ErrorAdvancedFeature
  3185.  
  3186. OBJECT.VX_II_
  3187.  bra ErrorAdvancedFeature
  3188.  
  3189. OBJECT.VY_II_
  3190.  bra ErrorAdvancedFeature
  3191.  
  3192. OBJECT.X_II_
  3193.  bra ErrorAdvancedFeature
  3194.  
  3195. OBJECT.Y_II_
  3196.  bra ErrorAdvancedFeature
  3197.  
  3198. ONBREAKGOSUB_Z_
  3199.  bra ErrorAdvancedFeature
  3200.  
  3201. ONCOLLISIONGOSUB_Z_
  3202.  bra ErrorAdvancedFeature
  3203.  
  3204. ONERRORGOTO_Z_
  3205.  bra ErrorAdvancedFeature
  3206.  
  3207. ONGOSUB_IIZ_II
  3208.  move.l (sp)+,a2
  3209.  move.l (sp)+,a3
  3210.  move.w (sp),d0
  3211.  bmi ErrorIllegalFunctionCall
  3212.  addq.w #1,2(sp)
  3213.  cmp.w 2(sp),d0
  3214.  beq.s ON_GOSUB_IIZ_II_DoGosub
  3215.  jmp (a2)
  3216. ON_GOSUB_IIZ_II_DoGosub
  3217.  moveq #6,d0
  3218.  bsr TestStackMem
  3219.  move.l StackPointer(a5),a0
  3220.  move.l a2,(a0)+
  3221.  move.w #STACK_GOSUB,(a0)+
  3222.  move.l a0,StackPointer(a5)
  3223.  jmp (a3)
  3224.  
  3225. ONGOTO_IIZ_II
  3226.  move.l (sp)+,a2
  3227.  move.l (sp)+,a3
  3228.  move.w (sp),d0
  3229.  bmi ErrorIllegalFunctionCall
  3230.  addq.w #1,2(sp)
  3231.  cmp.w 2(sp),d0
  3232.  beq.s ON_GOTO_IIZ_II_DoGoto
  3233.  jmp (a2)
  3234. ON_GOTO_IIZ_II_DoGoto
  3235.  addq.l #4,sp
  3236.  jmp (a3)
  3237.  
  3238. ONMENUGOSUB_Z_
  3239.  bra ErrorAdvancedFeature
  3240.  
  3241. ONMOUSEGOSUB_Z_
  3242.  bra ErrorAdvancedFeature
  3243.  
  3244. ONTIMERGOSUB_IZ_
  3245.  bra ErrorAdvancedFeature
  3246.  
  3247. PAINT_IIII_
  3248.  bra ErrorAdvancedFeature
  3249.  
  3250. PALETTE_IRRR_
  3251.  bra ErrorAdvancedFeature
  3252.  
  3253. PATTERN1_L_
  3254.  bra ErrorAdvancedFeature
  3255.  
  3256. PATTERN2_L_
  3257.  bra ErrorAdvancedFeature
  3258.  
  3259. POINT_II_I
  3260.  bra ErrorAdvancedFeature
  3261.  
  3262. POKEL_LL_
  3263.  move.l (sp)+,a2
  3264.  move.l (sp)+,d0
  3265.  move.l (sp)+,a0
  3266.  move.l a0,d1
  3267.  btst #0,d1
  3268.  bne ErrorIllegalFunctionCall
  3269.  move.l d0,(a0)
  3270.  jmp (a2)
  3271.  
  3272. POKEW_LI_
  3273.  move.l (sp)+,a2
  3274.  move.w (sp)+,d0
  3275.  move.l (sp)+,a0
  3276.  move.l a0,d1
  3277.  btst #0,d1
  3278.  bne ErrorIllegalFunctionCall
  3279.  move.w d0,(a0)
  3280.  jmp (a2)
  3281.  
  3282. POKE_LI_
  3283.  move.l (sp)+,a2
  3284.  move.w (sp)+,d0
  3285.  move.l (sp)+,a0
  3286.  move.b d0,(a0)
  3287.  jmp (a2)
  3288.  
  3289. PRESET_III_
  3290.  bra ErrorAdvancedFeature
  3291.  
  3292. PRINTQMARK__
  3293.  pea QMarkText
  3294.  bsr PRINT_T_
  3295.  rts
  3296.  
  3297. PRINTRETURN__
  3298.  pea RetText
  3299.  bsr PRINT_T_
  3300.  rts
  3301.  
  3302. PRINTTAB__
  3303.  pea TabText
  3304.  bsr PRINT_T_
  3305.  rts
  3306.  
  3307. PRINT_D_
  3308.  move.l (sp)+,a2
  3309.  movem.l (sp)+,d0/d1
  3310.  movem.l d0/d1/a2,-(sp)
  3311.  bsr STR_D_T
  3312.  bsr PRINT_T_
  3313.  rts
  3314.  
  3315. PRINT_I_
  3316.  move.l (sp)+,a2
  3317.  move.w (sp)+,d0
  3318.  ext.l d0
  3319.  move.l d0,-(sp)
  3320.  move.l a2,-(sp)
  3321.  bra PRINT_L_
  3322.  
  3323. PRINT_L_
  3324.  move.l (sp)+,a2
  3325.  move.l (sp)+,d0
  3326.  move.l a2,-(sp)
  3327.  move.l d0,-(sp)
  3328.  bsr STR_L_T
  3329.  bsr PRINT_T_
  3330.  rts
  3331.  
  3332. PRINT_R_
  3333.  move.l (sp)+,a2
  3334.  move.l (sp)+,d0
  3335.  move.l a2,-(sp)
  3336.  move.l d0,-(sp)
  3337.  bsr STR_R_T
  3338.  bsr PRINT_T_
  3339.  rts
  3340.  
  3341. PRINT_T_
  3342.  move.l (sp)+,a2
  3343.  Break_Off
  3344.  tst.l OutputFenster(a5)
  3345.  beq.s PRINT_T__NoFenster
  3346.  move.l OutputFenster(a5),a1
  3347.  move.l FENSTER_CONSOLEWRITE(a1),a1
  3348.  move.l (sp)+,a0
  3349.  move.l (a0),a0
  3350.  moveq #0,d0
  3351.  move.w (a0)+,d0
  3352.  move.l d0,IO_LENGTH(a1)
  3353.  move.l a0,IO_DATA(a1)
  3354.  move.w #CMD_WRITE,IO_COMMAND(a1)
  3355.  CallSys DoIO
  3356. PRINT_T__NoFenster
  3357.  Break_On
  3358.  jmp (a2)
  3359.  
  3360. PSET_III_
  3361.  bra ErrorAdvancedFeature
  3362.  
  3363. RANDOMIZE_I_
  3364.  bra ErrorAdvancedFeature
  3365.  
  3366. RANDOMIZE__
  3367.  bra ErrorAdvancedFeature
  3368.  
  3369. READ__T
  3370.  move.l (sp)+,a2
  3371.  move.w NextData(a5),d0
  3372.  cmp.w NumData(a5),d0
  3373.  bhi ErrorOutOfData
  3374.  addq.w #1,NextData(a5)
  3375.  lsl.w #1,d0
  3376.  move.l DataPointer(a5),a0
  3377.  move.w 0(a0,d0.w),d0
  3378.  pea 0(a5,d0.w)
  3379.  jmp (a2)
  3380.  
  3381. RESTORE_I_
  3382.  move.l (sp)+,a2
  3383.  move.w (sp)+,NextData(a5)
  3384.  jmp (a2)
  3385.  
  3386. RESTORE__
  3387.  clr.w NextData(a5)
  3388.  rts
  3389.  
  3390. RESUMENEXT__
  3391.  bra ErrorAdvancedFeature
  3392.  
  3393. RESUME_Z_
  3394.  bra ErrorAdvancedFeature
  3395.  
  3396. RESUME__
  3397.  bra ErrorAdvancedFeature
  3398.  
  3399. RETURN_Z_
  3400.  move.l StackPointer(a5),a0
  3401.  cmp.l StackMem(a5),a0
  3402.  beq ErrorReturnWithoutGosub
  3403.  cmp.w #STACK_GOSUB,-(a0)
  3404.  bne ErrorReturnWithoutGosub
  3405.  subq.l #4,a0
  3406.  move.l a0,StackPointer(a5)
  3407.  addq.l #4,sp
  3408.  rts
  3409.  
  3410. RETURN__
  3411.  move.l StackPointer(a5),a0
  3412.  cmp.l StackMem(a5),a0
  3413.  beq ErrorReturnWithoutGosub
  3414.  cmp.w #STACK_GOSUB,-(a0)
  3415.  bne ErrorReturnWithoutGosub
  3416.  move.l -(a0),(sp)
  3417.  move.l a0,StackPointer(a5)
  3418.  rts
  3419.  
  3420. RUN_Z_
  3421.  bra ErrorAdvancedFeature
  3422.  
  3423. RUN__
  3424.  bra ErrorAdvancedFeature
  3425.  
  3426. SCREENCLOSE_I_
  3427.  bra ErrorAdvancedFeature
  3428.  
  3429. SCREEN_IIIII_
  3430.  bra ErrorAdvancedFeature
  3431.  
  3432. SCROLL_IIIIII_
  3433.  bra ErrorAdvancedFeature
  3434.  
  3435. ; So läßt sich bei einem Fehler-Abbruch die aktuelle Sourcecode-Zeile
  3436. ; feststellen, allerdings muß diese Routine vom Hauptprogramm immer
  3437. ; dann aufgerufen werden, wenn eine neue BASIC-Zeile Übersetzt wird.
  3438. SETLINE_L_
  3439.  move.l (sp)+,a2
  3440.  move.l (sp)+,ThisSourceLine(a5)
  3441.  cmp.l OldSP(a5),sp
  3442.  bne ErrorStackTrashed
  3443.  jmp (a2)
  3444.  
  3445. SETMEM_L_
  3446.  bra ErrorAdvancedFeature
  3447.  
  3448. SETSTACK_L_
  3449.  bra ErrorAdvancedFeature
  3450.  
  3451. SLEEP__
  3452.  bra ErrorAdvancedFeature
  3453.  
  3454. SOUNDRESUME__
  3455.  bra ErrorAdvancedFeature
  3456.  
  3457. SOUNDWAIT__
  3458.  bra ErrorAdvancedFeature
  3459.  
  3460. SOUND_IIII_
  3461.  bra ErrorAdvancedFeature
  3462.  
  3463. SWAP_dd_
  3464.  movem.l (sp)+,a0/a1/a2
  3465.  movem.l (a1),d0/d1
  3466.  movem.l (a2),d2/d3
  3467.  movem.l d2/d3,(a1)
  3468.  movem.l d0/d1,(a2)
  3469.  jmp (a0)
  3470.  
  3471. SWAP_ii_
  3472.  movem.l (sp)+,a0/a1/a2
  3473.  move.w (a1),d0
  3474.  move.w (a2),(a1)
  3475.  move.w d0,(a2)
  3476.  jmp (a0)
  3477.  
  3478. SWAP_ll_
  3479.  movem.l (sp)+,a0/a1/a2
  3480.  move.l (a1),d0
  3481.  move.l (a2),(a1)
  3482.  move.l d0,(a1)
  3483.  jmp (a0)
  3484.  
  3485. SWAP_rr_
  3486.  movem.l (sp)+,a0/a1/a2
  3487.  move.l (a1),d0
  3488.  move.l (a2),(a1)
  3489.  move.l d0,(a1)
  3490.  jmp (a0)
  3491.  
  3492. SWAP_tt_
  3493.  movem.l (sp)+,a0/a1/a2
  3494.  move.l (a1),d0
  3495.  move.l (a2),(a1)
  3496.  move.l d0,(a1)
  3497.  jmp (a0)
  3498.  
  3499. SYSTEM__ EQU END__
  3500.  
  3501. TIMEROFF__
  3502.  bra ErrorAdvancedFeature
  3503.  
  3504. TIMERON__
  3505.  bra ErrorAdvancedFeature
  3506.  
  3507. TIMERSTOP__
  3508.  bra ErrorAdvancedFeature
  3509.  
  3510. TRANSLATE_T_T
  3511.  bra ErrorAdvancedFeature
  3512.  
  3513. TROFF__
  3514.  bra ErrorAdvancedFeature
  3515.  
  3516. TRON__
  3517.  bra ErrorAdvancedFeature
  3518.  
  3519. WINDOWCLOSE_I_
  3520.  move.l (sp)+,a2
  3521.  CallSys Forbid
  3522.  move.w (sp)+,d0
  3523.  lea FensterListPointer(a5),a3
  3524. WINDOWCLOSE_I__SearchLoop
  3525.  move.l a3,a0
  3526.  tst.l (a0)
  3527.  beq ErrorIllegalFunctionCall
  3528.  move.l (a0),a3
  3529.  cmp.w FENSTER_NUMBER(a3),d0
  3530.  bne.s WINDOWCLOSE_I__SearchLoop
  3531.  move.l (a3),(a0)
  3532.  cmp.l OutputFenster(a5),a3
  3533.  beq.s WINDOWCLOSE_I__NotTheOutputFenster
  3534.  clr.l OutputFenster(a5)
  3535. WINDOWCLOSE_I__NotTheOutputFenster
  3536.  move.l FENSTER_CONSOLEWRITE(a3),a0
  3537.  bsr CloseConsole
  3538.  move.l FENSTER_WINDOW(a3),a0
  3539.  CallIntuition CloseWindow
  3540.  move.l FENSTER_TITLE(a3),a1
  3541.  bsr MyFreeMem
  3542.  move.l a3,a1
  3543.  bsr MyFreeMem
  3544.  CallSys Permit
  3545.  jmp (a2)
  3546.  
  3547. WINDOWOUTPUT_I_
  3548.  bra ErrorAdvancedFeature
  3549.  
  3550. WINDOW_ITIIIIII_
  3551.  Break_Off
  3552. ; Speicher für Fensterstruktur reservieren
  3553.  moveq #FENSTER_SIZEOF,d0
  3554.  moveq #0,d1
  3555.  bsr MyAllocMem
  3556.  move.l d0,a3
  3557. ; Werte vom Stack lesen und auswerten
  3558.  lea NewWindowStruct(a5),a0
  3559. ; Rückkehradresse
  3560.  move.l (sp)+,a2
  3561. ; Screen
  3562.  addq.l #2,sp      ; überlesen DEBUG
  3563.  move.w #WBENCHSCREEN,nw_Type(a0)
  3564.  clr.l nw_Screen(a0)
  3565. ; Typ
  3566.  move.w (sp)+,d0
  3567.  move.l #ACTIVATE|GIMMEZEROZERO,d1
  3568.  btst #0,d0
  3569.  beq.s NoWindowSizing
  3570.  or.l #WINDOWSIZING|SIZEBRIGHT,d1
  3571. NoWindowSizing
  3572.  btst #1,d0
  3573.  beq.s NoWindowDrag
  3574.  or.l #WINDOWDRAG,d1
  3575. NoWindowDrag
  3576.  btst #2,d0
  3577.  beq.s NoWindowDepth
  3578.  or.l #WINDOWDEPTH,d1
  3579. NoWindowDepth
  3580.  btst #3,d0
  3581.  beq.s NoWindowClose
  3582.  or.l #WINDOWCLOSE,d1
  3583. NoWindowClose
  3584.  btst #4,d0
  3585.  beq.s NoSuperBitMap
  3586.  or.l #SUPER_BITMAP,d1
  3587. NoSuperBitMap
  3588.  move.l d1,nw_Flags(a0)
  3589.  move.l #CLOSEWINDOW|MOUSEBUTTONS|RAWKEY,nw_IDCMPFlags(a0)
  3590. ; Koordinaten
  3591.  move.w (sp)+,d3
  3592.  move.w (sp)+,d2
  3593.  move.w (sp)+,d1
  3594.  move.w (sp)+,d0
  3595.  sub.w d0,d2
  3596.  addq.w #1,d2
  3597.  cmp.w #Window_MinWidth,d2
  3598.  blt ErrorIllegalFunctionCall
  3599.  sub.w d1,d3
  3600.  addq.w #1,d3
  3601.  cmp.w #Window_MinHeight,d3
  3602.  blt ErrorIllegalFunctionCall
  3603.  move.w d0,nw_LeftEdge(a0)
  3604.  move.w d1,nw_TopEdge(a0)
  3605.  move.w d2,nw_Width(a0)
  3606.  move.w d3,nw_Height(a0)
  3607. ; Pens
  3608.  move.b #-1,nw_DetailPen(a0)
  3609.  move.b #-1,nw_BlockPen(a0)
  3610. ; FirstGadget ist immer Null
  3611. ; CheckMark ist immer Null
  3612.  move.l (sp)+,a1
  3613.  move.l (a1),a1
  3614.  moveq #0,d0
  3615.  move.w (a1),d0
  3616.  addq.w #1,d0
  3617.  moveq #0,d1
  3618.  bsr MyAllocMem
  3619.  move.l d0,FENSTER_TITLE(a3)
  3620.  move.l d0,nw_Title(a0)
  3621.  move.l a0,-(sp)
  3622.  move.l d0,a0
  3623.  move.w (a1)+,d0
  3624. WindowTitleLoop
  3625.  move.b (a1)+,(a0)+
  3626.  dbra d0,WindowTitleLoop
  3627.  move.l (sp)+,a0
  3628. ; Bitmap
  3629.  clr.l nw_BitMap(a0)
  3630.  move.w #Window_MinWidth,nw_MinWidth(a0)
  3631.  move.w #Window_MinHeight,nw_MinHeight(a0)
  3632.  move.w #-1,nw_MaxWidth(a0)
  3633.  move.w #-1,nw_MaxHeight(a0)
  3634.  move.w (sp)+,FENSTER_NUMBER(a3)
  3635. ; Das Fenster wirklich öffnen
  3636.  CallIntuition OpenWindow
  3637.  move.l d0,FENSTER_WINDOW(a3)
  3638.  beq ErrorCannotOpenWindow
  3639.  move.l d0,a0
  3640.  bsr OpenConsole
  3641.  tst.l d0
  3642.  beq GotNoConsole
  3643.  move.l d0,FENSTER_CONSOLEWRITE(a3)
  3644.  move.l a3,OutputFenster(a5)
  3645.  move.l FensterListPointer(a5),FENSTER_NEXT(a3)
  3646.  move.l a3,FensterListPointer(a5)
  3647. ; Exception-Flag setzen
  3648.  move.l FENSTER_WINDOW(a3),a0
  3649.  move.l wd_UserPort(a0),a0
  3650.  move.b MP_SIGBIT(a0),d2
  3651.  moveq #0,d0
  3652.  bset d2,d0
  3653.  move.l d0,d1
  3654.  CallSys SetExcept
  3655.  Break_On
  3656.  move.l a2,-(sp)
  3657.  bra CursorOff
  3658. GotNoConsole
  3659.  move.l FENSTER_WINDOW(a3),a0
  3660.  CallIntuition CloseWindow
  3661.  bra ErrorCouldNotOpenConsole
  3662.  
  3663. ; **********************************************************************
  3664. ; *                                                                    *
  3665. ; * Stringfunktionen                                                   *
  3666. ; *                                                                    *
  3667. ; **********************************************************************
  3668.  
  3669. ADD_TT_T
  3670.  move.l (sp)+,a2
  3671.  move.l (sp)+,a1
  3672.  move.l (sp)+,a0
  3673.  move.l (a0),a0
  3674.  move.l (a1),a1
  3675.  move.w (a0)+,d0
  3676.  move.w (a1)+,d1
  3677.  move.w d0,d2
  3678.  add.w d1,d2
  3679.  move.w d2,a3
  3680.  bsr CreateString
  3681.  move.l a3,-(sp)
  3682.  move.l a2,-(sp)
  3683.  move.l (a3),a3
  3684.  move.w d2,(a3)+
  3685.  bsr.s ADD_TT_T_EnterLoop
  3686.  move.l a1,a0
  3687.  move.w d1,d0
  3688.  bsr.s ADD_TT_T_EnterLoop
  3689.  bra FinishString
  3690. ADD_TT_T_Loop
  3691.  move.b (a0)+,(a3)+
  3692. ADD_TT_T_EnterLoop
  3693.  dbra d0,ADD_TT_T_Loop
  3694.  rts
  3695.  
  3696. ASC_T_I
  3697.  movem.l (sp)+,a0/a1
  3698.  move.l (a1),a1
  3699.  tst.w (a1)+
  3700.  beq ErrorIllegalFunctionCall
  3701.  moveq #0,d0
  3702.  move.b (a1),d0
  3703.  move.w d0,-(sp)
  3704.  jmp (a0)
  3705.  
  3706. CHR_I_T
  3707.  move.w #1,a3
  3708.  bsr CreateString
  3709.  move.l (sp)+,a0
  3710.  move.w (sp)+,d0
  3711.  bmi ErrorIllegalFunctionCall
  3712.  cmp.w #256,d0
  3713.  bge ErrorIllegalFunctionCall
  3714.  move.l a3,-(sp)
  3715.  move.l (a3),a1
  3716.  move.w #1,(a1)+
  3717.  move.b d0,(a1)
  3718.  move.l a0,-(sp)
  3719.  bra FinishString
  3720.  
  3721. CVD_T_D
  3722.  move.l (sp)+,a2
  3723.  move.l (sp)+,a0
  3724.  move.l (a0),a0
  3725.  cmp.w #8,(a0)+
  3726.  blt ErrorIllegalFunctionCall
  3727.  movem.l (a0),d0/d1
  3728.  movem.l d0/d1,-(sp)
  3729.  jmp (a2)
  3730.  
  3731. CVI_T_I
  3732.  move.l (sp)+,a2
  3733.  move.l (sp)+,a0
  3734.  move.l (a0),a0
  3735.  cmp.w #2,(a0)+
  3736.  blt ErrorIllegalFunctionCall
  3737.  move.w (a0),-(sp)
  3738.  jmp (a2)
  3739.  
  3740. CVL_T_L
  3741.  move.l (sp)+,a2
  3742.  move.l (sp)+,a0
  3743.  move.l (a0),a0
  3744.  cmp.w #4,(a0)+
  3745.  blt ErrorIllegalFunctionCall
  3746.  move.l (a0),-(sp)
  3747.  jmp (a2)
  3748.  
  3749. CVL_T_R EQU CVL_T_L
  3750.  
  3751. EQ_TT_I
  3752.  movem.l (sp)+,a0/a1/a2
  3753.  move.l (a1),a1
  3754.  move.l (a2),a2
  3755.  move.w (a1)+,d0
  3756.  cmp.w (a2)+,d0
  3757.  bne.s EQ_TT_I_False
  3758.  bra.s EQ_TT_I_EnterLoop
  3759. EQ_TT_I_Loop
  3760.  cmpm.b (a1)+,(a2)+
  3761.  bne.s EQ_TT_I_False
  3762. EQ_TT_I_EnterLoop
  3763.  dbra d0,EQ_TT_I_Loop
  3764.  move.w #-1,-(sp)
  3765.  jmp (a0)
  3766. EQ_TT_I_False
  3767.  clr.w -(sp)
  3768.  jmp (a0)
  3769.  
  3770. GE_TT_I
  3771.  moveq #3,d7
  3772.  bra CompareStrings
  3773.  
  3774. GT_TT_I
  3775.  moveq #1,d7
  3776.  bra CompareStrings
  3777.  
  3778. HEX_L_T
  3779.  move.w #8,a3
  3780.  bsr CreateString
  3781.  move.l 4(sp),d0
  3782.  move.l a3,4(sp)
  3783.  move.l (a3),a0
  3784.  move.w #8,(a0)+
  3785.  moveq #7,d1
  3786.  lea HexTable,a1
  3787.  moveq #0,d2
  3788. HEX_L_T_Loop
  3789.  rol.l #4,d0
  3790.  move.b d0,d2
  3791.  and.b #$f,d2
  3792.  move.b 0(a1,d2.w),(a0)+
  3793.  dbra d1,HEX_L_T_Loop
  3794.  bra FinishString
  3795. HexTable
  3796.  dc.b "0123456789ABCDEF"
  3797.  even
  3798.  
  3799. ; d0: verbleibende Versuche
  3800. ; d1: Länge String2
  3801. ; d2: ggf. richtiges Ergebnis
  3802. ; a0: Rest von String1
  3803. ; a1: Anfang von String2
  3804. INSTR_ITT_I
  3805.  move.l (sp)+,a2
  3806.  move.l (sp)+,a1
  3807.  move.l (a1),a1
  3808.  move.l (sp)+,a0
  3809.  move.l (a0),a0
  3810.  move.w (sp)+,d2
  3811.  ble ErrorIllegalFunctionCall
  3812.  move.w (a0)+,d0
  3813.  beq.s INSTR_ITT_I_0
  3814.  move.w (a1)+,d1
  3815.  beq.s INSTR_ITT_I_1
  3816.  sub.w d2,d0
  3817.  sub.w d1,d0
  3818.  addq.w #2,d0
  3819.  bmi INSTR_ITT_I_0
  3820.  lea -1(a0,d2.w),a0
  3821.  bra.s INSTR_ITT_I_EnterLoop
  3822. INSTR_ITT_I_Loop
  3823.  move.w d1,d5
  3824.  move.l a0,d6
  3825.  move.l a1,d7
  3826.  bra.s INSTR_ITT_I_EnterCompLoop
  3827. INSTR_ITT_I_CompLoop
  3828.  cmpm.b (a0)+,(a1)+
  3829.  bne.s INSTR_ITT_I_NotFound
  3830. INSTR_ITT_I_EnterCompLoop
  3831.  dbra d5,INSTR_ITT_I_CompLoop
  3832.  bra.s INSTR_ITT_I_D2
  3833. INSTR_ITT_I_NotFound
  3834.  move.l d6,a0
  3835.  move.l d7,a1
  3836.  addq.l #1,a0
  3837.  addq.w #1,d2
  3838. INSTR_ITT_I_EnterLoop
  3839.  dbra d0,INSTR_ITT_I_Loop
  3840. INSTR_ITT_I_0
  3841.  clr.w -(sp)
  3842.  jmp (a2)
  3843. INSTR_ITT_I_D2
  3844.  move.w d2,-(sp)
  3845.  jmp (a2)
  3846. INSTR_ITT_I_1
  3847.  move.w #1,-(sp)
  3848.  jmp (a2)
  3849.  
  3850. INSTR_TT_I
  3851.  movem.l (sp)+,a0/a1/a2
  3852.  move.w #1,-(sp)
  3853.  movem.l a0/a1/a2,-(sp)
  3854.  bra INSTR_ITT_I
  3855.  
  3856. LEFT_TI_T
  3857.  move.l (sp)+,a2
  3858.  move.w (sp)+,d0
  3859.  bmi ErrorIllegalFunctionCall
  3860.  move.w #1,-(sp)
  3861.  move.w d0,-(sp)
  3862.  move.l a2,-(sp)
  3863.  bra MID_TII_T
  3864.  
  3865. LEN_T_I
  3866.  movem.l (sp)+,a0/a1
  3867.  move.l (a1),a1
  3868.  move.w (a1),-(sp)
  3869.  jmp (a0)
  3870.  
  3871. LE_TT_I
  3872.  moveq #6,d7
  3873.  bra CompareStrings
  3874.  
  3875. LT_TT_I
  3876.  moveq #4,d7
  3877.  bra CompareStrings
  3878.  
  3879. MID_TII_T
  3880.  move.l (sp)+,a2
  3881.  move.w (sp)+,d1
  3882.  bmi ErrorIllegalFunctionCall
  3883.  move.w (sp)+,d0
  3884.  ble ErrorIllegalFunctionCall
  3885.  move.l (sp)+,a0
  3886.  move.l (a0),a0
  3887.  move.w (a0)+,d2
  3888.  subq.w #1,d0
  3889.  lea 0(a0,d0.w),a0
  3890.  sub.w d0,d2
  3891.  cmp.w d2,d1
  3892.  ble MID_TII_T_NotTooLong
  3893.  move.w d2,d1
  3894. MID_TII_T_NotTooLong
  3895.  tst.w d1
  3896.  ble MID_TII_T_ReturnEmptyString
  3897.  move.w d1,a3
  3898.  bsr CreateString
  3899.  move.l a3,-(sp)
  3900.  move.l (a3),a1
  3901.  move.w d1,(a1)+
  3902.  bra.s MID_TII_T_EnterLoop
  3903. MID_TII_T_Loop
  3904.  move.b (a0)+,(a1)+
  3905. MID_TII_T_EnterLoop
  3906.  dbra d1,MID_TII_T_Loop
  3907.  bsr FinishString
  3908.  jmp (a2)
  3909. MID_TII_T_ReturnEmptyString
  3910.  pea LeerString
  3911.  jmp (a2)
  3912.  
  3913. MID_TI_T
  3914.  move.l (sp)+,a2
  3915.  move.w #$7fff,-(sp)
  3916.  move.l a2,-(sp)
  3917.  bra MID_TII_T
  3918.  
  3919. MKD_D_T
  3920.  move.w #8,a3
  3921.  bsr CreateString
  3922.  move.l (sp)+,a2
  3923.  movem.l (sp)+,d0/d1
  3924.  move.l a3,-(sp)
  3925.  move.l (a3),a0
  3926.  move.w #8,(a0)+
  3927.  movem.l d0/d1,(a0)
  3928.  bsr FinishString
  3929.  jmp (a2)
  3930.  
  3931. MKI_I_T
  3932.  move.w #2,a3
  3933.  bsr CreateString
  3934.  move.l (sp)+,a2
  3935.  move.w (sp)+,d0
  3936.  move.l a3,-(sp)
  3937.  move.l (a3),a0
  3938.  move.w #2,(a0)+
  3939.  move.w d0,(a0)
  3940.  bsr FinishString
  3941.  jmp (a2)
  3942.  
  3943. MKL_L_T
  3944.  move.w #4,a3
  3945.  bsr CreateString
  3946.  move.l (a3),a0
  3947.  move.w #4,(a0)+
  3948.  move.l 4(sp),(a0)
  3949.  move.l a3,4(sp)
  3950.  bra FinishString
  3951.  
  3952. MKS_R_T EQU MKL_L_T
  3953.  
  3954. NE_TT_I
  3955.  movem.l (sp)+,a0/a1/a2
  3956.  move.l (a1),a1
  3957.  move.l (a2),a2
  3958.  move.w (a1)+,d0
  3959.  cmp.w (a2)+,d0
  3960.  bne.s NE_TT_I_True
  3961.  bra.s NE_TT_I_EnterLoop
  3962. NE_TT_I_Loop
  3963.  cmpm.b (a1)+,(a2)+
  3964.  bne.s NE_TT_I_True
  3965. NE_TT_I_EnterLoop
  3966.  dbra d0,NE_TT_I_Loop
  3967.  clr.w -(sp)
  3968.  jmp (a0)
  3969. NE_TT_I_True
  3970.  move.w #-1,-(sp)
  3971.  jmp (a0)
  3972.  
  3973. OCT_L_T
  3974.  bra ErrorAdvancedFeature
  3975.  
  3976. RIGHT_TI_T
  3977.  move.l (sp)+,a2
  3978.  move.w (sp)+,d0
  3979.  bmi ErrorIllegalFunctionCall
  3980.  move.l (sp),a0
  3981.  move.l (a0),a0
  3982.  cmp.w (a0),d0
  3983.  ble.s RIGHT_TI_T_NoCutString
  3984.  move.w (a0),d0
  3985. RIGHT_TI_T_NoCutString
  3986.  move.w (a0),d1
  3987.  sub.w d0,d1
  3988.  addq.w #1,d1
  3989.  move.w d1,-(sp)
  3990.  move.w d0,-(sp)
  3991.  move.l a2,-(sp)
  3992.  bra MID_TII_T
  3993.  
  3994. SADD_T_L
  3995.  move.l 4(sp),a0
  3996.  move.l (a0),a0
  3997.  addq.l #2,a0
  3998.  move.l a0,4(sp)
  3999.  rts
  4000.  
  4001. SETMID_tIIT_
  4002.  bra ErrorAdvancedFeature
  4003.  
  4004. SETMID_tIT_
  4005.  bra ErrorAdvancedFeature
  4006.  
  4007. SPACE_I_T
  4008.  move.l (sp)+,a2
  4009.  move.w (sp)+,d0
  4010.  move.w d0,a3
  4011.  bsr CreateString
  4012.  move.l a3,-(sp)
  4013.  move.l a2,-(sp)
  4014.  move.l (a3),a3
  4015.  move.w d0,(a3)+
  4016.  bra.s SPACE_I_T_EnterLoop
  4017. SPACE_I_T_Loop
  4018.  move.b #' ',(a3)+
  4019. SPACE_I_T_EnterLoop
  4020.  dbra d0,SPACE_I_T_Loop
  4021.  bra FinishString
  4022.  
  4023. STRING_II_T
  4024.  move.l (sp)+,a2
  4025.  move.w (sp)+,d0
  4026.  bmi ErrorIllegalFunctionCall
  4027.  cmp.w #256,d0
  4028.  bge ErrorIllegalFunctionCall
  4029.  bra Enter_STRING_IT_T
  4030.  
  4031. STRING_IT_T
  4032.  move.l (sp)+,a2
  4033.  move.l (sp)+,a0
  4034.  move.l (a0),a0
  4035.  tst.w (a0)+
  4036.  beq ErrorIllegalFunctionCall
  4037.  move.b (a0),d0
  4038. Enter_STRING_IT_T
  4039.  move.w (sp)+,d1
  4040.  move.w d1,a3
  4041.  bsr CreateString
  4042.  move.l a3,-(sp)
  4043.  move.l a2,-(sp)
  4044.  move.l (a3),a3
  4045.  move.w d1,(a3)+
  4046.  bra.s STRING_IT_T_EnterLoop
  4047. STRING_IT_T_Loop
  4048.  move.b d0,(a3)+
  4049. STRING_IT_T_EnterLoop
  4050.  dbra d1,STRING_IT_T_Loop
  4051.  bra FinishString
  4052.  
  4053. STR_D_T
  4054.  move.l (sp)+,a2
  4055.  moveq #IEEEDP_NumNumbers,d5 ; Stellenzahl
  4056.  movem.l (sp)+,d6/d7
  4057. STR_D_T_EnterMe
  4058. ; String zum Ablegen erzeugen
  4059.  move.w #100,a3
  4060.  bsr CreateString
  4061.  move.l a3,-(sp)
  4062.  move.l a2,-(sp)
  4063.  move.l (a3),a3
  4064.  move.l a3,a2
  4065.  clr.w (a3)+
  4066. ; Zahl gleich Null, positiv oder negativ?
  4067.  move.l d6,d0
  4068.  move.l d7,d1
  4069.  CallMathIeeeDoubBas IEEEDPTst
  4070.  beq STR_D_T_ReturnZero
  4071.  bpl.s STR_D_T_IsPositive
  4072.  move.b #'-',(a3)+
  4073.  move.l d6,d0
  4074.  move.l d7,d1
  4075.  CallMathIeeeDoubBas IEEEDPAbs
  4076.  move.l d0,d6
  4077.  move.l d1,d7
  4078.  bra.s STR_D_T_IsNegative
  4079. STR_D_T_IsPositive
  4080.  move.b #' ',(a3)+
  4081. STR_D_T_IsNegative
  4082. ; Zehnerexponent isolieren
  4083.  move.l d6,d0
  4084.  move.l d7,d1
  4085.  CallMathIeeeDoubTrans IEEEDPLog10
  4086.  CallMathIeeeDoubBas IEEEDPFloor
  4087.  move.l d0,-(sp)
  4088.  move.l d1,-(sp)
  4089.  CallMathIeeeDoubBas IEEEDPFix
  4090.  move.l d0,d4                ; Exponent
  4091.  move.l #$40240000,d0        ; 10 im IEEEDP-Format
  4092.  moveq #0,d1
  4093.  move.l (sp)+,d3
  4094.  move.l (sp)+,d2
  4095.  CallMathIeeeDoubTrans IEEEDPPow
  4096.  move.l d0,d2
  4097.  move.l d1,d3
  4098.  move.l d6,d0
  4099.  move.l d7,d1
  4100.  CallMathIeeeDoubBas IEEEDPDiv
  4101.  move.l d0,d6
  4102.  move.l d1,d7
  4103. ; Zehnerexponent in d4
  4104. ; Stellenzahl in d5
  4105. ; Zahl in d6/d7    (Vorzeichen ist behandelt, Zahl ist ungleich 0)
  4106.  move.l a2,-(sp)
  4107.  movem.l d6/d7,VALVar(a5)
  4108.  move.l d5,d6
  4109.  lea DecMantisse(a5),a2
  4110.  clr.b (a2)+
  4111. STR_D_T_CreateNumbersLoop
  4112.  movem.l VALVar(a5),d0/d1
  4113.  CallMathIeeeDoubBas IEEEDPFloor
  4114.  move.l d0,-(sp)
  4115.  move.l d1,-(sp)
  4116.  CallMathIeeeDoubBas IEEEDPFix
  4117.  move.b d0,(a2)+
  4118.  movem.l VALVar(a5),d0/d1
  4119.  move.l (sp)+,d3
  4120.  move.l (sp)+,d2
  4121.  CallMathIeeeDoubBas IEEEDPSub
  4122.  move.l #$40240000,d2        ; 10 im IEEEDP-Format
  4123.  moveq #0,d3
  4124.  CallMathIeeeDoubBas IEEEDPMul
  4125.  movem.l d0/d1,VALVar(a5)
  4126.  dbra d6,STR_D_T_CreateNumbersLoop
  4127. ; runden
  4128.  cmp.b #5,-(a2)
  4129.  blt.s STR_D_T_NoRoundUp
  4130.  addq.b #1,-1(a2)
  4131. STR_D_T_NoRoundUp
  4132.  move.l d5,d6
  4133.  bra.s STR_D_T_EnterRoundLoop
  4134. STR_D_T_RoundLoop
  4135.  cmp.b #10,-(a2)
  4136.  blt.s STR_D_T_NotGreaterNine
  4137.  sub.b #10,(a2)
  4138.  addq.b #1,-1(a2)
  4139. STR_D_T_NotGreaterNine
  4140. STR_D_T_EnterRoundLoop
  4141.  dbra d6,STR_D_T_RoundLoop
  4142.  move.l (sp)+,a2
  4143. ; a0 zeigt auf erstes Zeichen der Mantisse, a1 hinter das letzte
  4144.  lea DecMantisse+1(a5),a0
  4145.  lea 0(a0,d5),a1
  4146.  tst.b -1(a0)
  4147.  beq.s STR_D_T_NoOverflow
  4148.  subq.l #1,a0
  4149.  subq.l #1,a1
  4150.  addq.l #1,d4
  4151. STR_D_T_NoOverflow
  4152. STR_D_T_RemoveZerosLoop
  4153.  tst.b -1(a1)
  4154.  bne.s STR_D_T_NoMoreZeros
  4155.  subq.l #1,a1
  4156.  cmp.l a0,a1
  4157.  beq STR_D_T_ReturnZero
  4158.  bra.s STR_D_T_RemoveZerosLoop
  4159. STR_D_T_NoMoreZeros
  4160. ; Position des Kommas feststellen
  4161.  moveq #1,d6
  4162.  cmp.l d5,d4
  4163.  bge.s STR_D_T_DoExp
  4164.  move.l d5,d7
  4165.  neg.l d7
  4166.  cmp.l d7,d4
  4167.  ble.s STR_D_T_DoExp
  4168.  add.l d4,d6
  4169.  moveq #0,d4
  4170. STR_D_T_DoExp
  4171. ; Zahl in den String schreiben
  4172.  tst.l d6               ; führende Nullen ausgeben
  4173.  bgt.s STR_D_T_NoFrontZeros
  4174.  move.b #'.',(a3)+
  4175. STR_D_T_FrontZerosLoop
  4176.  addq.l #1,d6
  4177.  bgt.s STR_D_T_NoMoreFrontZeros
  4178.  move.b #'0',(a3)+
  4179.  bra.s STR_D_T_FrontZerosLoop
  4180. STR_D_T_NoMoreFrontZeros
  4181.  subq.l #2,d6
  4182. STR_D_T_NoFrontZeros
  4183. STR_D_T_Output1Loop     ; Zahlen ausgeben
  4184.  cmp.l a0,a1
  4185.  beq.s STR_D_T_NoMoreNumbers
  4186.  tst.l d6
  4187.  bne.s STR_D_T_NoPutPoint
  4188.  move.b #'.',(a3)+
  4189. STR_D_T_NoPutPoint
  4190.  subq.l #1,d6
  4191.  move.b (a0)+,d0
  4192.  add.b #'0',d0
  4193.  move.b d0,(a3)+
  4194.  bra.s STR_D_T_Output1Loop
  4195. STR_D_T_NoMoreNumbers
  4196.  tst.l d6               ; Nullen am Ende ausgeben
  4197.  ble.s STR_D_T_Output1Finished
  4198.  move.b #'0',(a3)+
  4199.  subq.l #1,d6
  4200.  bra.s STR_D_T_NoMoreNumbers
  4201. STR_D_T_Output1Finished
  4202. ; Exponent ggf. ausgeben
  4203.  clr.b (a3)
  4204.  tst.l d4
  4205.  beq.s STR_D_T_NoExponentOutput
  4206.  cmp.l #IEEEDP_NumNumbers,d5
  4207.  beq.s STR_D_T_OutPutD
  4208.  move.b #'E',(a3)+
  4209.  bra.s STR_D_T_OutPutE
  4210. STR_D_T_OutPutD
  4211.  move.b #'D',(a3)+
  4212. STR_D_T_OutPutE
  4213.  tst.l d4
  4214.  bmi.s STR_D_T_ExpNegative
  4215.  move.b #'+',(a3)+
  4216. STR_D_T_ExpNegative
  4217.  move.l a2,-(sp)
  4218.  lea STR_D_T_FormatString,a0
  4219.  move.l FreeStringPointer(a5),a1
  4220.  move.l d4,(a1)
  4221.  lea RawDoFmtProc,a2
  4222.  CallSys RawDoFmt
  4223.  move.l (sp)+,a2
  4224. STR_D_T_NoExponentOutput
  4225. ; Stringlänge berechnen
  4226.  move.l a2,a3
  4227.  move.w #-1,(a3)+
  4228. STR_D_T_GetStringLen
  4229.  addq.w #1,(a2)
  4230.  tst.b (a3)+
  4231.  bne.s STR_D_T_GetStringLen
  4232.  bra FinishString
  4233. STR_D_T_ReturnZero
  4234.  move.w #' 0',(a3)+
  4235.  move.w #2,(a2)
  4236.  bra FinishString
  4237. STR_D_T_FormatString
  4238.  dc.b "%ld",0
  4239.  even
  4240.  
  4241. STR_I_T
  4242.  move.l (sp)+,a2
  4243.  move.w (sp)+,d0
  4244.  ext.l d0
  4245.  move.l d0,-(sp)
  4246.  move.l a2,-(sp)
  4247.  bra STR_L_T
  4248.  
  4249. STR_L_T_String
  4250.  dc.b " %ld",0
  4251.  even
  4252. STR_L_T
  4253.  Break_Off
  4254.  move.w #20,a3
  4255.  bsr CreateString
  4256.  move.l a3,d7
  4257.  lea STR_L_T_String,a0
  4258.  lea 4(sp),a1
  4259.  tst.l (a1)
  4260.  bpl.s STR_L_T_UseSpace
  4261.  addq.l #1,a0
  4262. STR_L_T_UseSpace
  4263.  lea RawDoFmtProc,a2
  4264.  move.l (a3),a3
  4265.  addq.l #2,a3
  4266.  CallSys RawDoFmt
  4267.  move.l d7,4(sp)
  4268.  move.l d7,a0
  4269.  move.l (a0),a0
  4270.  move.l a0,a1
  4271.  clr.w (a1)+
  4272. STR_L_T_TestStringLenght
  4273.  tst.b (a1)+
  4274.  beq.s STR_L_T_EndOfNewStringReached
  4275.  addq.w #1,(a0)
  4276.  bra.s STR_L_T_TestStringLenght
  4277. STR_L_T_EndOfNewStringReached
  4278.  bsr FinishString
  4279.  Break_On
  4280.  rts
  4281.  
  4282. STR_R_T
  4283.  move.l (sp)+,a2
  4284.  move.l (sp)+,d0
  4285.  CallMathTrans SPTieee
  4286.  IEEEDPFieee
  4287.  moveq #SP_NumNumbers,d5     ; Stellenzahl
  4288.  move.l d0,d6
  4289.  move.l d1,d7
  4290.  bra STR_D_T_EnterMe
  4291.  
  4292. UCASE_T_T
  4293.  move.l 4(sp),a0
  4294.  move.l (a0),a0
  4295.  move.w (a0)+,d0
  4296.  move.w d0,a3
  4297.  bsr CreateString
  4298.  move.l a3,4(sp)
  4299.  move.l (a3),a1
  4300.  move.w d0,(a1)+
  4301.  bra.s UCASE_T_T_EnterLoop
  4302. UCASE_T_T_Loop
  4303.  move.b (a0)+,d1
  4304.  cmp.b #'a',d1
  4305.  blt.s UCASE_T_T_NotToUpper
  4306.  cmp.b #'z',d1
  4307.  bgt.s UCASE_T_T_NotToUpper
  4308.  and.b #$df,d1
  4309. UCASE_T_T_NotToUpper
  4310.  move.b d1,(a1)+
  4311. UCASE_T_T_EnterLoop
  4312.  dbra d0,UCASE_T_T_Loop
  4313.  bra FinishString
  4314.  
  4315. VAL_T_D
  4316.  move.l (sp)+,a2
  4317.  move.l (sp)+,a0
  4318.  move.l (a0),a0
  4319.  move.w (a0)+,d0
  4320.  bsr VAL_T_D_SkipSpaces
  4321. ; Vorzeichen
  4322.  moveq #0,d3
  4323.  tst.w d0
  4324.  beq.s VAL_T_D_NoMinus
  4325.  cmp.b #'-',(a0)
  4326.  bne.s VAL_T_D_NoMinus
  4327.  moveq #-1,d3
  4328.  subq.w #1,d0
  4329.  addq.l #1,a0
  4330. VAL_T_D_NoMinus
  4331. ; Mantisse auslesen
  4332.  moveq #0,d4       ; 64 Bit Mantisse
  4333.  moveq #0,d5
  4334.  moveq #0,d6       ; Noch keinen Dezimalpunkt gefunden
  4335.  moveq #0,d7       ; Zehnerexponent
  4336. VAL_T_D_Pass1Loop
  4337.  tst.w d0
  4338.  beq VAL_T_D_Pass1Finished
  4339.  move.b (a0)+,d1
  4340.  subq.w #1,d0
  4341.  cmp.b #'.',d1
  4342.  beq VAL_T_D_FoundPoint
  4343.  cmp.b #'E',d1
  4344.  beq VAL_T_D_FoundExponent
  4345.  cmp.b #'e',d1
  4346.  beq VAL_T_D_FoundExponent
  4347.  cmp.b #'D',d1
  4348.  beq VAL_T_D_FoundExponent
  4349.  cmp.b #'d',d1
  4350.  beq VAL_T_D_FoundExponent
  4351.  cmp.b #'0',d1
  4352.  blt VAL_T_D_Pass1Finished
  4353.  cmp.b #'9',d1
  4354.  bgt VAL_T_D_Pass1Finished
  4355.  sub.b #'0',d1
  4356.  ext.w d1
  4357.  ext.l d1
  4358. ; Paßt noch etwas in die Mantisse hinein?
  4359. ;  $0de0b6b3a7640000 10^18
  4360. ;  $8ac7230489e80000 10^19
  4361.  cmp.l #$0de0b6b3,d4
  4362.  bhi VAL_T_D_MantisseFull
  4363.  bne.s VAL_T_D_MantisseNotFull
  4364.  cmp.l #$a7640000,d5
  4365.  bhi VAL_T_D_MantisseFull
  4366. VAL_T_D_MantisseNotFull
  4367. ; auf Punkt achten
  4368.  tst.l d6
  4369.  beq.s VAL_T_D_NoPointYet
  4370.  subq.l #1,d7
  4371. VAL_T_D_NoPointYet
  4372. ; d4/d5 verzehnfachen
  4373.  movem.l d6/d7,-(sp)
  4374.  add.l d5,d5
  4375.  addx.l d4,d4
  4376.  move.l d5,d7
  4377.  move.l d4,d6
  4378.  add.l d5,d5
  4379.  addx.l d4,d4
  4380.  add.l d5,d5
  4381.  addx.l d4,d4
  4382.  add.l d7,d5
  4383.  addx.l d6,d4
  4384.  movem.l (sp)+,d6/d7
  4385. ; d1 dazu
  4386.  add.l d1,d5
  4387.  bcc.s VAL_T_D_CarryClear
  4388.  addq.l #1,d4
  4389. VAL_T_D_CarryClear
  4390.  bra VAL_T_D_Pass1Loop
  4391. ; Dezimalpunkt gefunden
  4392. VAL_T_D_FoundPoint
  4393.  not.l d6
  4394.  beq VAL_T_D_Pass1Finished
  4395.  bra VAL_T_D_Pass1Loop
  4396. ; Kein Platz mehr in der Mantisse
  4397. VAL_T_D_MantisseFull
  4398.  tst.l d6
  4399.  bne VAL_T_D_Pass1Loop
  4400.  addq.l #1,d7
  4401.  bra VAL_T_D_Pass1Loop
  4402. ;
  4403. ; Exponent auswerten
  4404. ;
  4405. ; d2 kommt zum Zehnerexponenten noch dazu
  4406. VAL_T_D_FoundExponent
  4407. ; Vorzeichen des Exponenten
  4408.  moveq #1,d6
  4409.  tst.w d0
  4410.  beq.s VAL_T_D_ExponentNotPlusOrMinus
  4411.  cmp.b #'-',(a0)
  4412.  bne.s VAL_T_D_ExponentNotMinus
  4413.  moveq #-1,d6
  4414.  subq.w #1,d0
  4415.  addq.l #1,a0
  4416.  bra.s VAL_T_D_ExponentWasMinus
  4417. VAL_T_D_ExponentNotMinus
  4418.  cmp.b #'+',(a0)
  4419.  bne.s VAL_T_D_ExponentNotPlusOrMinus
  4420.  subq.w #1,d0
  4421.  addq.l #1,a0
  4422. VAL_T_D_ExponentWasMinus
  4423. VAL_T_D_ExponentNotPlusOrMinus
  4424. ; Exponent selber auslesen
  4425.  moveq #0,d2
  4426. VAL_T_D_ExponentLoop
  4427.  subq.w #1,d0
  4428.  bmi.s VAL_T_D_NoMoreExponentChars
  4429.  move.b (a0)+,d1
  4430.  sub.b #'0',d1
  4431.  bmi.s VAL_T_D_NoMoreExponentChars
  4432.  cmp.b #10,d1
  4433.  bge.s VAL_T_D_NoMoreExponentChars
  4434.  move.l d1,-(sp)
  4435.  add.l d2,d2
  4436.  move.l d2,d1
  4437.  add.l d2,d2
  4438.  add.l d2,d2
  4439.  add.l d1,d2
  4440.  add.l (sp)+,d2
  4441.  cmp.l #10000,d2
  4442.  bgt ErrorOverflow
  4443.  bra.s VAL_T_D_ExponentLoop
  4444. VAL_T_D_NoMoreExponentChars
  4445.  muls d6,d2
  4446.  add.l d2,d7
  4447. ;
  4448. ; in Double-Zahl wandeln
  4449. ;
  4450. VAL_T_D_Pass1Finished
  4451. ; Vorzeichen in d3, Mantisse in d4/d5, Zehnerexponent in d7
  4452. ; Ist das Ergebnis 0?
  4453.  tst.l d4
  4454.  bne.s VAL_T_D_NotZero
  4455.  tst.l d5
  4456.  beq VAL_T_D_ReturnZero
  4457. VAL_T_D_NotZero
  4458. ; ggf. nach rechts schieben
  4459.  move.l #$43300000,d0
  4460. VAL_T_D_ShiftRightLoop1
  4461.  cmp.l #$003fffff,d4
  4462.  bls.s VAL_T_D_LeaveShiftRightLoop1
  4463.  add.l #$00100000,d0
  4464.  lsr.l #1,d5
  4465.  lsr.l #1,d4
  4466.  bcc.s VAL_T_D_ShiftRightLoop1
  4467.  bset #31,d5
  4468.  bra.s VAL_T_D_ShiftRightLoop1
  4469. VAL_T_D_LeaveShiftRightLoop1
  4470. ; ggf. nach links schieben
  4471. VAL_T_D_ShiftLeftLoop
  4472.  btst #21,d4
  4473.  bne.s VAL_T_D_LeaveShiftLeftLoop
  4474.  sub.l #$00100000,d0
  4475.  lsl.l #1,d4
  4476.  lsl.l #1,d5
  4477.  bcc.s VAL_T_D_ShiftLeftLoop
  4478.  bset #0,d4
  4479.  bra.s VAL_T_D_ShiftLeftLoop
  4480. VAL_T_D_LeaveShiftLeftLoop
  4481. ; Aufrunden
  4482.  addq.l #1,d5
  4483.  bcc.s VAL_T_D_NoRoundOverflow
  4484.  addq.l #1,d4
  4485. VAL_T_D_NoRoundOverflow
  4486. ; Nochmal nach rechts schieben
  4487. VAL_T_D_ShiftRightLoop2
  4488.  cmp.l #$001fffff,d4
  4489.  bls.s VAL_T_D_LeaveShiftRightLoop2
  4490.  add.l #$00100000,d0
  4491.  lsr.l #1,d5
  4492.  lsr.l #1,d4
  4493.  bcc.s VAL_T_D_ShiftRightLoop2
  4494.  bset #31,d5
  4495.  bra.s VAL_T_D_ShiftRightLoop2
  4496. VAL_T_D_LeaveShiftRightLoop2
  4497. ; fertig mit Schieben
  4498.  bclr #20,d4
  4499.  or.l d0,d4
  4500.  tst.l d3
  4501.  beq.s VAL_T_D_NotNegativ
  4502.  bset #31,d4
  4503. VAL_T_D_NotNegativ
  4504. ; Zehnerexponenten berücksichtigen
  4505.  move.l d7,d0
  4506.  CallMathIeeeDoubBas IEEEDPFlt
  4507.  move.l d0,d2
  4508.  move.l d1,d3
  4509.  move.l #$40240000,d0        ; 10 im IEEEDP-Format
  4510.  moveq #0,d1
  4511.  CallMathIeeeDoubTrans IEEEDPPow
  4512.  bvs ErrorOverflow
  4513.  move.l d4,d2
  4514.  move.l d5,d3
  4515.  CallMathIeeeDoubBas IEEEDPMul
  4516.  bvs ErrorOverflow
  4517.  movem.l d0/d1,-(sp)
  4518.  jmp (a2)
  4519. VAL_T_D_ReturnZero
  4520.  clr.l -(sp)
  4521.  clr.l -(sp)
  4522.  jmp (a2)
  4523. VAL_T_D_SkipSpaces
  4524.  tst.w d0
  4525.  beq.s VAL_T_D_NoMoreSpaces
  4526.  cmp.b #' ',(a0)
  4527.  bne.s VAL_T_D_NoMoreSpaces
  4528.  addq.l #1,a0
  4529.  subq.w #1,d0
  4530.  bra.s VAL_T_D_SkipSpaces
  4531. VAL_T_D_NoMoreSpaces
  4532.  rts
  4533.  
  4534. ; d7:
  4535. ; Bit 0: Darf String 1 größer sein?
  4536. ; Bit 1: Dürfen die Strings identisch sein?
  4537. ; Bit 2: Darf String 2 größer sein?
  4538. CompareStrings
  4539.  move.l (sp)+,a2
  4540.  move.l (sp)+,a1
  4541.  move.l (sp)+,a0
  4542.  move.l (a0),a0
  4543.  move.l (a1),a1
  4544.  move.w (a0)+,d0
  4545.  move.w (a1)+,d1
  4546. NoDecisionMade
  4547.  tst.w d0
  4548.  beq.s String1Empty
  4549.  tst.w d1
  4550.  beq.s String1IsGreater
  4551.  subq.w #1,d0
  4552.  subq.w #1,d1
  4553.  cmpm.b (a0)+,(a1)+
  4554.  beq.s NoDecisionMade
  4555.  bhi.s String2IsGreater
  4556. String1IsGreater
  4557.  moveq #1,d0
  4558.  bra.s LeaveCompareStrings
  4559. String2IsGreater
  4560.  moveq #4,d0
  4561.  bra.s LeaveCompareStrings
  4562. String1Empty
  4563.  tst.w d1
  4564.  bne.s String2IsGreater
  4565.  moveq #2,d0                 ; Die Strings sind identisch
  4566. LeaveCompareStrings
  4567.  and.l d7,d0
  4568.  bne.s CompStringsTrue
  4569.  clr.w -(sp)
  4570.  jmp (a2)
  4571. CompStringsTrue
  4572.  move.w #-1,-(sp)
  4573.  jmp (a2)
  4574.  
  4575. ; **********************************************************************
  4576. ; *                                                                    *
  4577. ; * I/O-Basicanweisungen                                               *
  4578. ; *                                                                    *
  4579. ; **********************************************************************
  4580.  
  4581. CHDIR_T_
  4582.  Break_Off
  4583.  move.l (sp)+,a2
  4584.  move.l (sp)+,a0
  4585.  move.l (a0),a0
  4586.  addq.l #2,a0
  4587.  bsr LockIt
  4588.  move.l d0,d1
  4589.  CallDOS CurrentDir
  4590.  move.l d0,d1
  4591.  CallDOS UnLock
  4592.  Break_On
  4593.  jmp (a2)
  4594.  
  4595. CLOSE__
  4596.  move.l FileListPointer(a5),d0
  4597.  beq.s NoMoreFiles
  4598.  move.l d0,a0
  4599.  move.w FL_NUMBER(a0),-(sp)
  4600.  bsr CLOSE_I_
  4601.  bra.s CLOSE__
  4602. NoMoreFiles
  4603.  rts
  4604.  
  4605. CLOSE_I_
  4606.  move.l (sp)+,a2
  4607.  Break_Off
  4608.  move.w (sp)+,d0
  4609.  bsr ReallyFindFileStruct
  4610. ; Aus der Liste entfernen
  4611.  lea FileListPointer(a5),a0
  4612. CLOSE_I__Loop
  4613.  cmp.l FL_NEXT(a0),a3
  4614.  beq.s CLOSE_I__FoundIt
  4615.  move.l FL_NEXT(a0),a0
  4616.  bra.s CLOSE_I__Loop
  4617. CLOSE_I__FoundIt
  4618.  move.l FL_NEXT(a3),FL_NEXT(a0)
  4619. ; ggf. noch schreiben
  4620.  cmp.w #IOACCESS_OUTPUT,FL_ACCESSMODE(a3)
  4621.  bne.s CLOSE_I__NoOutputFile
  4622.  move.l FL_BUFFERNUMBYTES(a3),d3
  4623.  beq.s CLOSE_I__BufferEmpty
  4624.  lea FL_BUFFER(a3),a0
  4625.  move.l a0,d2
  4626.  move.l FL_FILEHANDLE(a3),d1
  4627.  CallDOS Write
  4628.  tst.b ErrorOccured(a5)
  4629.  bne.s CLOSE_I__DontCareForError
  4630.  tst.l d0
  4631.  bmi ErrorIO
  4632. CLOSE_I__DontCareForError
  4633. CLOSE_I__BufferEmpty
  4634. CLOSE_I__NoOutputFile
  4635. ; File schließen
  4636.  move.l FL_FILEHANDLE(a3),d1
  4637.  CallDOS Close
  4638. ; Speicher freigeben
  4639.  move.l a3,a1
  4640.  bsr MyFreeMem
  4641. ; fertig
  4642.  Break_On
  4643.  jmp (a2)
  4644.  
  4645. EOF_I_I
  4646.  move.w 4(sp),d0
  4647.  bsr ReallyFindFileStruct
  4648.  cmp.w #IOACCESS_INPUT,FL_ACCESSMODE(a3)
  4649.  bne ErrorBadFileMode
  4650.  move.l FL_FILEPOS(a3),d0
  4651.  sub.l FL_BUFFERNUMBYTES(a3),d0
  4652.  cmp.l FL_FILELENGTH(a3),d0
  4653.  seq d0
  4654.  ext.w d0
  4655.  move.w d0,4(sp)
  4656.  rts
  4657.  
  4658. FILEINPUT_I_IT
  4659.  bra ErrorAdvancedFeature
  4660.  
  4661. FILELINEINPUT_I_T
  4662.  Break_Off
  4663.  move.l (sp)+,d7
  4664.  move.w (sp)+,d0
  4665.  bsr ReallyFindFileStruct
  4666.  cmp.w #IOACCESS_INPUT,FL_ACCESSMODE(a3)
  4667.  bne ErrorBadFileMode
  4668.  move.l FL_FILEPOS(a3),d0
  4669.  sub.l FL_BUFFERNUMBYTES(a3),d0
  4670.  cmp.l FL_FILELENGTH(a3),d0
  4671.  beq ErrorInputPastEnd
  4672.  move.l a3,d6
  4673.  move.w #MAXLINEINPUTLEN,a3
  4674.  bsr CreateString
  4675.  move.l a3,-(sp)
  4676.  move.l (a3),a0
  4677.  move.l a0,a1
  4678.  clr.w (a1)+
  4679.  move.l d6,a3
  4680.  move.l d7,-(sp)
  4681. FILELINEINPUT_I_T_AddToString
  4682.  lea FL_BUFFER(a3),a2
  4683.  add.l FL_BUFFEROFFSET(a3),a2
  4684.  move.l FL_BUFFERNUMBYTES(a3),d0
  4685.  bra.s FILELINEINPUT_I_T_EnterLoop
  4686. FILELINEINPUT_I_T_Loop
  4687.  move.b (a2)+,d1
  4688.  addq.l #1,FL_BUFFEROFFSET(a3)
  4689.  subq.l #1,FL_BUFFERNUMBYTES(a3)
  4690.  cmp.b #10,d1
  4691.  beq.s FILELINEINPUT_I_T_ReachedEnd
  4692.  cmp.w #MAXLINEINPUTLEN,(a0)
  4693.  beq ErrorStringTooLong
  4694.  move.b d1,(a1)+
  4695.  addq.w #1,(a0)
  4696. FILELINEINPUT_I_T_EnterLoop
  4697.  dbra d0,FILELINEINPUT_I_T_Loop
  4698.  move.l FL_FILELENGTH(a3),d0
  4699.  sub.l FL_FILEPOS(a3),d0
  4700.  ble.s FILELINEINPUT_I_T_ReachedEnd
  4701.  cmp.l #BUFFERSIZE,d0
  4702.  ble.s FILELINEINPUT_I_T_D0Ok
  4703.  move.l #BUFFERSIZE,d0
  4704. FILELINEINPUT_I_T_D0Ok
  4705.  clr.l FL_BUFFEROFFSET(a3)
  4706.  move.l d0,FL_BUFFERNUMBYTES(a3)
  4707.  add.l d0,FL_FILEPOS(a3)
  4708.  move.l FL_FILEHANDLE(a3),d1
  4709.  pea FL_BUFFER(a3)
  4710.  move.l (sp)+,d2
  4711.  move.l d0,d3
  4712.  movem.l a0/a1,-(sp)
  4713.  CallDOS Read
  4714.  movem.l (sp)+,a0/a1
  4715.  tst.l d0
  4716.  bmi ErrorIO
  4717.  bra.s FILELINEINPUT_I_T_AddToString
  4718. FILELINEINPUT_I_T_ReachedEnd
  4719.  Break_On
  4720.  bra FinishString
  4721.  
  4722. FILEPRINTRETURN_I_I
  4723.  move.l (sp)+,a2
  4724.  pea RetText
  4725.  move.l a2,-(sp)
  4726.  bra FILEPRINT_IT_I
  4727.  
  4728. FILEPRINTTAB_I_I
  4729.  move.l (sp)+,a2
  4730.  pea TabText
  4731.  move.l a2,-(sp)
  4732.  bra FILEPRINT_IT_I
  4733.  
  4734. FILEPRINT_ID_I
  4735.  move.l (sp)+,a2
  4736.  movem.l (sp)+,d0/d1
  4737.  move.w (sp)+,d2
  4738.  move.l a2,-(sp)
  4739.  move.w d2,-(sp)
  4740.  movem.l d0/d1,-(sp)
  4741.  bsr STR_D_T
  4742.  bsr FILEPRINT_IT_I
  4743.  move.w (sp)+,d0
  4744.  move.l (sp)+,a2
  4745.  move.w d0,-(sp)
  4746.  jmp (a2)
  4747.  
  4748. FILEPRINT_II_I
  4749.  move.l (sp)+,a2
  4750.  move.w (sp)+,d0
  4751.  move.w (sp)+,d1
  4752.  move.l a2,-(sp)
  4753.  move.w d1,-(sp)
  4754.  move.w d0,-(sp)
  4755.  bsr STR_I_T
  4756.  bsr FILEPRINT_IT_I
  4757.  move.w (sp)+,d0
  4758.  move.l (sp)+,a2
  4759.  move.w d0,-(sp)
  4760.  jmp (a2)
  4761.  
  4762. FILEPRINT_IL_I
  4763.  move.l (sp)+,a2
  4764.  move.l (sp)+,d0
  4765.  move.w (sp)+,d1
  4766.  move.l a2,-(sp)
  4767.  move.w d1,-(sp)
  4768.  move.l d0,-(sp)
  4769.  bsr STR_L_T
  4770.  bsr FILEPRINT_IT_I
  4771.  move.w (sp)+,d0
  4772.  move.l (sp)+,a2
  4773.  move.w d0,-(sp)
  4774.  jmp (a2)
  4775.  
  4776. FILEPRINT_IR_I
  4777.  move.l (sp)+,a2
  4778.  move.l (sp)+,d0
  4779.  move.w (sp)+,d1
  4780.  move.l a2,-(sp)
  4781.  move.w d1,-(sp)
  4782.  move.l d0,-(sp)
  4783.  bsr STR_R_T
  4784.  bsr FILEPRINT_IT_I
  4785.  move.w (sp)+,d0
  4786.  move.l (sp)+,a2
  4787.  move.w d0,-(sp)
  4788.  jmp (a2)
  4789.  
  4790. FILEPRINT_IT_I
  4791.  Break_Off
  4792.  move.l (sp)+,a2
  4793.  move.l (sp)+,a0
  4794.  move.l (a0),a0
  4795.  moveq #0,d3
  4796.  move.w (a0)+,d3
  4797.  move.l a0,d2
  4798.  move.w (sp),d0
  4799.  bsr ReallyFindFileStruct
  4800.  cmp.w #IOACCESS_OUTPUT,FL_ACCESSMODE(a3)
  4801.  bne ErrorBadFileMode
  4802.  add.l d3,FL_FILELENGTH(a3)
  4803.  add.l d3,FL_FILEPOS(a3)
  4804. ; Puffer benutzen?
  4805.  cmp.l #BUFFERSIZE,d3
  4806.  blt.s FILEPRINT_IT_I_BufferIt
  4807. ; Puffer nicht benutzen, zuerst aber ausgeben
  4808.  tst.l FL_BUFFERNUMBYTES(a3)
  4809.  beq.s FILEPRINT_IT_I_BufferEmpty
  4810.  move.l d2,-(sp)
  4811.  move.l d3,-(sp)
  4812.  lea FL_BUFFER(a3),a0
  4813.  move.l a0,d2
  4814.  move.l FL_BUFFERNUMBYTES(a3),d3
  4815.  clr.l FL_BUFFERNUMBYTES(a3)
  4816.  move.l FL_FILEHANDLE(a3),d1
  4817.  CallDOS Write
  4818.  tst.l d0
  4819.  bmi ErrorIO
  4820.  move.l (sp)+,d3
  4821.  move.l (sp)+,d2
  4822. FILEPRINT_IT_I_BufferEmpty
  4823.  move.l FL_FILEHANDLE(a3),d1
  4824.  CallDOS Write
  4825.  tst.l d0
  4826.  bmi ErrorIO
  4827.  Break_On
  4828.  jmp (a2)
  4829. FILEPRINT_IT_I_BufferIt
  4830. FILEPRINT_IT_I_BufferLoop
  4831. ; Anzahl der in den Puffer zu schreibenden Bytes bestimmen
  4832.  move.l #BUFFERSIZE,d4
  4833.  sub.l FL_BUFFERNUMBYTES(a3),d4
  4834.  bne.s FILEPRINT_IT_I_BufferNotFull
  4835.  move.l d2,-(sp)
  4836.  move.l d3,-(sp)
  4837.  clr.l FL_BUFFERNUMBYTES(a3)
  4838.  move.l #BUFFERSIZE,d3
  4839.  lea FL_BUFFER(a3),a0
  4840.  move.l a0,d2
  4841.  move.l FL_FILEHANDLE(a3),d1
  4842.  CallDOS Write
  4843.  tst.l d0
  4844.  bmi ErrorIO
  4845.  move.l (sp)+,d3
  4846.  move.l (sp)+,d2
  4847.  bra.s FILEPRINT_IT_I_BufferLoop
  4848. FILEPRINT_IT_I_BufferNotFull
  4849.  cmp.l d3,d4
  4850.  ble.s FILEPRINT_IT_I_D4IsOk
  4851.  move.l d3,d4
  4852. FILEPRINT_IT_I_D4IsOk
  4853. ; Zahl der noch zu schreibenden Bytes verringern, in den Puffer kopieren
  4854.  sub.l d4,d3
  4855.  move.l d2,a0
  4856.  lea FL_BUFFER(a3),a1
  4857.  add.l FL_BUFFERNUMBYTES(a3),a1
  4858.  add.l d4,FL_BUFFERNUMBYTES(a3)
  4859.  bra.s FILEPRINT_IT_I_EnterCopyLoop
  4860. FILEPRINT_IT_I_CopyLoop
  4861.  move.b (a0)+,(a1)+
  4862. FILEPRINT_IT_I_EnterCopyLoop
  4863.  dbra d4,FILEPRINT_IT_I_CopyLoop
  4864.  move.l a0,d2
  4865.  tst.l d3
  4866.  bgt.s FILEPRINT_IT_I_BufferLoop
  4867.  Break_On
  4868.  jmp (a2)
  4869.  
  4870. FILES_T_
  4871.  Break_Off
  4872. ; Directory of... ausgeben
  4873.  pea FilesText
  4874.  bsr PRINT_T_
  4875. ; Namen holen und untersuchen
  4876.  move.l (sp)+,a2
  4877.  move.l (sp)+,a0
  4878.  move.l a2,-(sp)
  4879.  move.l (a0),a0
  4880.  addq.l #2,a0
  4881.  bsr LockIt
  4882.  move.l d0,d7
  4883. ; Namen ausgeben
  4884. FILES_T__NextFile
  4885.  move.l FreeStringPointer(a5),a0
  4886.  addq.l #4,a0
  4887.  move.l a0,-4(a0)
  4888.  move.l a0,a1
  4889.  clr.w (a1)+
  4890.  move.l FileInfoBlock(a5),a2
  4891.  tst.l fib_DirEntryType(a2)
  4892.  bmi.s FILES_T__NoDir1
  4893.  move.b #"[",(a1)+
  4894.  addq.w #1,(a0)
  4895. FILES_T__NoDir1
  4896.  moveq #0,d0
  4897. FILES_T__NextChar
  4898.  tst.b fib_FileName(a2,d0.w)
  4899.  beq.s FILES_T__LastFound
  4900.  move.b fib_FileName(a2,d0.w),(a1)+
  4901.  addq.w #1,(a0)
  4902.  addq.w #1,d0
  4903.  cmp.w #108,d0
  4904.  bne.s FILES_T__NextChar
  4905. FILES_T__LastFound
  4906.  tst.l fib_DirEntryType(a2)
  4907.  bmi.s FILES_T__NoDir2
  4908.  move.b #"]",(a1)+
  4909.  addq.w #1,(a0)
  4910. FILES_T__NoDir2
  4911.  move.b #10,(a1)+
  4912.  addq.w #1,(a0)
  4913.  move.l FreeStringPointer(a5),-(sp)
  4914.  bsr PRINT_T_
  4915.  move.l d7,d1
  4916.  move.l FileInfoBlock(a5),d2
  4917.  CallDOS ExNext
  4918.  tst.l d0
  4919.  bne.s FILES_T__NextFile
  4920. ; Ist ein Fehler aufgetreten?
  4921.  CallDOS IoErr
  4922.  cmp.l #232,d0
  4923.  bne.s FILES_T__Error
  4924.  move.l d7,d1
  4925.  CallDOS UnLock
  4926.  Break_On
  4927.  rts
  4928. FILES_T__Error
  4929.  move.l d0,ThisIoError(a5)
  4930.  move.l d7,d1
  4931.  CallDOS UnLock
  4932.  bra ErrorIO
  4933.  
  4934. FILES__
  4935.  move.l (sp)+,a2
  4936.  pea LeerString
  4937.  move.l a2,-(sp)
  4938.  bra FILES_T_
  4939.  
  4940. INPUT_II_T
  4941.  Break_Off
  4942.  move.l (sp)+,d6
  4943.  move.w (sp)+,d0
  4944.  bsr ReallyFindFileStruct
  4945.  move.l a3,a2
  4946.  cmp.w #IOACCESS_INPUT,FL_ACCESSMODE(a2)
  4947.  bne ErrorBadFileMode
  4948.  moveq #0,d7
  4949.  move.w (sp)+,d7
  4950.  bmi ErrorIllegalFunctionCall
  4951.  move.l FL_FILEPOS(a2),d0
  4952.  sub.l FL_BUFFERNUMBYTES(a2),d0
  4953.  add.l d7,d0
  4954.  cmp.l FL_FILELENGTH(a2),d0
  4955.  bhi ErrorInputPastEnd
  4956.  move.w d7,a3
  4957.  bsr CreateString
  4958.  move.l a3,-(sp)
  4959.  move.l (a3),a3
  4960.  move.w d7,(a3)+
  4961.  move.l d6,-(sp)
  4962. INPUT_II_T_AddToString
  4963.  tst.w d7
  4964.  beq.s INPUT_II_T_ReachedEnd
  4965.  lea FL_BUFFER(a2),a0
  4966.  add.l FL_BUFFEROFFSET(a2),a0
  4967.  move.l FL_BUFFERNUMBYTES(a2),d0
  4968.  bra.s INPUT_II_T_EnterLoop
  4969. INPUT_II_T_Loop
  4970.  move.b (a0)+,(a3)+
  4971.  addq.l #1,FL_BUFFEROFFSET(a2)
  4972.  subq.l #1,FL_BUFFERNUMBYTES(a2)
  4973.  subq.w #1,d7
  4974.  ble.s INPUT_II_T_ReachedEnd
  4975. INPUT_II_T_EnterLoop
  4976.  dbra d0,INPUT_II_T_Loop
  4977.  move.l FL_FILELENGTH(a2),d0
  4978.  sub.l FL_FILEPOS(a2),d0
  4979.  cmp.l #BUFFERSIZE,d0
  4980.  ble.s INPUT_II_T_D0Ok
  4981.  move.l #BUFFERSIZE,d0
  4982. INPUT_II_T_D0Ok
  4983.  clr.l FL_BUFFEROFFSET(a2)
  4984.  move.l d0,FL_BUFFERNUMBYTES(a2)
  4985.  add.l d0,FL_FILEPOS(a2)
  4986.  move.l FL_FILEHANDLE(a2),d1
  4987.  pea FL_BUFFER(a2)
  4988.  move.l (sp)+,d2
  4989.  move.l d0,d3
  4990.  CallDOS Read
  4991.  tst.l d0
  4992.  bmi ErrorIO
  4993.  bra.s INPUT_II_T_AddToString
  4994. INPUT_II_T_ReachedEnd
  4995.  Break_On
  4996.  bra FinishString
  4997.  
  4998. KILL_T_
  4999.  Break_Off
  5000.  move.l (sp)+,a2
  5001.  move.l (sp)+,a0
  5002.  move.l (a0),d1
  5003.  addq.l #2,d1
  5004.  CallDOS DeleteFile
  5005.  tst.l d0
  5006.  beq ErrorIO
  5007.  Break_On
  5008.  jmp (a2)
  5009.  
  5010. LOF_I_L
  5011.  move.l (sp)+,a2
  5012.  move.w (sp)+,d0
  5013.  bsr ReallyFindFileStruct
  5014.  move.l FL_FILELENGTH(a3),-(sp)
  5015.  jmp (a2)
  5016.  
  5017. NAME_TT_
  5018.  Break_Off
  5019.  move.l (sp)+,a2
  5020.  move.l (sp)+,a1
  5021.  move.l (sp)+,a0
  5022.  move.l (a0),d1
  5023.  move.l (a1),d2
  5024.  addq.l #2,d1
  5025.  addq.l #2,d2
  5026.  CallDOS Rename
  5027.  tst.l d0
  5028.  beq ErrorIO
  5029.  Break_On
  5030.  jmp (a2)
  5031.  
  5032. OPENAPPEND_TI_
  5033.  Break_Off
  5034. ; Ist das File schon geöffnet?
  5035.  move.w 4(sp),d0
  5036.  bsr FindFileStruct
  5037.  cmp.l #0,a3
  5038.  bne ErrorFileAlreadyOpen
  5039. ; File-Struktur besorgen
  5040.  move.l #FL_SIZEOF,d0
  5041.  moveq #0,d1
  5042.  bsr MyAllocMem
  5043.  move.l d0,a2
  5044. ; File-Struktur initialisieren
  5045.  move.w 4(sp),FL_NUMBER(a2)
  5046.  move.w #IOACCESS_OUTPUT,FL_ACCESSMODE(a2)
  5047.  clr.l FL_FILELENGTH(a2)
  5048.  clr.l FL_BUFFEROFFSET(a2)
  5049.  clr.l FL_BUFFERNUMBYTES(a2)
  5050.  clr.l FL_FILEPOS(a2)
  5051. ; File öffnen
  5052.  move.l 6(sp),a0
  5053.  move.l (a0),d1
  5054.  addq.l #2,d1
  5055.  move.l #MODE_OLDFILE,d2
  5056.  CallDOS Open
  5057.  move.l d0,FL_FILEHANDLE(a2)
  5058.  beq OPENAPPEND_TI__OpenError
  5059.  move.l FL_FILEHANDLE(a2),d1
  5060.  moveq #0,d2
  5061.  moveq #OFFSET_END,d3
  5062.  CallDOS Seek
  5063.  move.l FL_FILEHANDLE(a2),d1
  5064.  moveq #0,d2
  5065.  moveq #OFFSET_CURRENT,d3
  5066.  CallDOS Seek
  5067.  move.l d0,FL_FILELENGTH(a2)
  5068. ; in die File-Liste eintragen
  5069.  move.l FileListPointer(a5),FL_NEXT(a2)
  5070.  move.l a2,FileListPointer(a5)
  5071. ; Fertig
  5072.  Break_On
  5073.  move.l (sp)+,a2
  5074.  addq.l #6,sp
  5075.  jmp (a2)
  5076. OPENAPPEND_TI__OpenError
  5077.  CallDOS IoErr
  5078.  move.l d0,ThisIoError(a5)
  5079.  bra ErrorIO
  5080.  
  5081. OPENINPUT_TI_
  5082.  Break_Off
  5083. ; Ist das File schon geöffnet?
  5084.  move.w 4(sp),d0
  5085.  bsr FindFileStruct
  5086.  cmp.l #0,a3
  5087.  bne ErrorFileAlreadyOpen
  5088. ; File-Struktur besorgen
  5089.  move.l #FL_SIZEOF,d0
  5090.  moveq #0,d1
  5091.  bsr MyAllocMem
  5092.  move.l d0,a2
  5093. ; File-Struktur initialisieren
  5094.  move.w 4(sp),FL_NUMBER(a2)
  5095.  move.w #IOACCESS_INPUT,FL_ACCESSMODE(a2)
  5096.  clr.l FL_BUFFEROFFSET(a2)
  5097.  clr.l FL_BUFFERNUMBYTES(a2)
  5098.  clr.l FL_FILEPOS(a2)
  5099. ; File öffnen
  5100.  move.l 6(sp),a0
  5101.  move.l (a0),d1
  5102.  addq.l #2,d1
  5103.  move.l #MODE_OLDFILE,d2
  5104.  CallDOS Open
  5105.  move.l d0,FL_FILEHANDLE(a2)
  5106.  beq OPENINPUT_TI__OpenError
  5107. ; File-Länge bestimmen
  5108.  move.l FL_FILEHANDLE(a2),d1
  5109.  moveq #0,d2
  5110.  moveq #OFFSET_END,d3
  5111.  CallDOS Seek
  5112.  move.l FL_FILEHANDLE(a2),d1
  5113.  moveq #0,d2
  5114.  moveq #OFFSET_BEGINNING,d3
  5115.  CallDOS Seek
  5116.  move.l d0,FL_FILELENGTH(a2)
  5117. ; in die File-Liste eintragen
  5118.  move.l FileListPointer(a5),FL_NEXT(a2)
  5119.  move.l a2,FileListPointer(a5)
  5120. ; Fertig
  5121.  Break_On
  5122.  move.l (sp)+,a2
  5123.  addq.l #6,sp
  5124.  jmp (a2)
  5125. OPENINPUT_TI__OpenError
  5126.  CallDOS IoErr
  5127.  move.l d0,ThisIoError(a5)
  5128.  bra ErrorIO
  5129.  
  5130. OPENOUTPUT_TI_
  5131.  Break_Off
  5132. ; Ist das File schon geöffnet?
  5133.  move.w 4(sp),d0
  5134.  bsr FindFileStruct
  5135.  cmp.l #0,a3
  5136.  bne ErrorFileAlreadyOpen
  5137. ; File-Struktur besorgen
  5138.  move.l #FL_SIZEOF,d0
  5139.  moveq #0,d1
  5140.  bsr MyAllocMem
  5141.  move.l d0,a2
  5142. ; File-Struktur initialisieren
  5143.  move.w 4(sp),FL_NUMBER(a2)
  5144.  move.w #IOACCESS_OUTPUT,FL_ACCESSMODE(a2)
  5145.  clr.l FL_FILELENGTH(a2)
  5146.  clr.l FL_BUFFEROFFSET(a2)
  5147.  clr.l FL_BUFFERNUMBYTES(a2)
  5148.  clr.l FL_FILEPOS(a2)
  5149. ; File öffnen
  5150.  move.l 6(sp),a0
  5151.  move.l (a0),d1
  5152.  addq.l #2,d1
  5153.  move.l #MODE_NEWFILE,d2
  5154.  CallDOS Open
  5155.  move.l d0,FL_FILEHANDLE(a2)
  5156.  beq OPENOUTPUT_TI__OpenError
  5157. ; in die File-Liste eintragen
  5158.  move.l FileListPointer(a5),FL_NEXT(a2)
  5159.  move.l a2,FileListPointer(a5)
  5160. ; Fertig
  5161.  Break_On
  5162.  move.l (sp)+,a2
  5163.  addq.l #6,sp
  5164.  jmp (a2)
  5165. OPENOUTPUT_TI__OpenError
  5166.  CallDOS IoErr
  5167.  move.l d0,ThisIoError(a5)
  5168.  bra ErrorIO
  5169.  
  5170. OPENREADWRITE_TI_
  5171.  bra ErrorAdvancedFeature
  5172.  
  5173. ; Versucht File mit Namen in a0 (Zeiger auf Zeiger) zu "locken" und
  5174. ; zu "examinen" und gibt den Lock in d0 zurück (prüft auf Directory)
  5175. LockIt
  5176.  move.l a0,d1
  5177.  moveq #ACCESS_READ,d2
  5178.  CallDOS Lock
  5179.  move.l d0,d7
  5180.  beq.s LockIt_CouldNotLockError
  5181.  move.l d7,d1
  5182.  move.l FileInfoBlock(a5),d2
  5183.  CallDOS Examine
  5184.  tst.l d0
  5185.  beq.s LockIt_CouldNotExamineError
  5186.  move.l FileInfoBlock(a5),a0
  5187.  tst.l fib_DirEntryType(a0)
  5188.  bmi.s LockIt_NoDirectoryError
  5189.  move.l d7,d0
  5190.  rts
  5191. LockIt_CouldNotLockError
  5192.  CallDOS IoErr
  5193.  move.l d0,ThisIoError(a5)
  5194.  bra ErrorIO
  5195. LockIt_CouldNotExamineError
  5196.  CallDOS IoErr
  5197.  move.l d0,ThisIoError(a5)
  5198.  move.l d7,d1
  5199.  CallDOS UnLock
  5200.  bra ErrorIO
  5201. LockIt_NoDirectoryError
  5202.  move.l d7,d1
  5203.  CallDOS UnLock
  5204.  bra ErrorNoDirectory
  5205.  
  5206. ; Filestruktur mit Nummer in d0 suchen, gibt Zeiger auf Struktur in a3 zurück
  5207. ;  (oder 0, wenn nicht gefunden)
  5208. FindFileStruct
  5209.  lea FileListPointer(a5),a3
  5210. LookNextFile
  5211.  move.l FL_NEXT(a3),a3
  5212.  cmp.l #0,a3
  5213.  beq.s NoSuchFile
  5214.  cmp.w FL_NUMBER(a3),d0
  5215.  bne.s LookNextFile
  5216. NoSuchFile
  5217.  rts
  5218.  
  5219. ; Gleich wie FindFileStruct, nur wird abgebrochen, wenn das File nicht
  5220. ;  gefunden wurde
  5221. ReallyFindFileStruct
  5222.  bsr FindFileStruct
  5223.  cmp.l #0,a3
  5224.  beq ErrorBadFileNumber
  5225.  rts
  5226.  
  5227. ; **********************************************************************
  5228. ; *                                                                    *
  5229. ; * Felderfunktionen                                                   *
  5230. ; *                                                                    *
  5231. ; **********************************************************************
  5232.  
  5233. DIMDOUB_FP_
  5234.  move.l (sp)+,a2
  5235.  move.l (sp)+,a0
  5236.  moveq #3,d7
  5237.  bsr DimField
  5238.  move.l FirstLocalField(a5),FIELD_NEXT(a0)
  5239.  move.l a0,FirstLocalField(a5)
  5240.  jmp (a2)
  5241.  
  5242. DIMINT_FP_
  5243.  move.l (sp)+,a2
  5244.  move.l (sp)+,a0
  5245.  moveq #1,d7
  5246.  bsr DimField
  5247.  move.l FirstLocalField(a5),FIELD_NEXT(a0)
  5248.  move.l a0,FirstLocalField(a5)
  5249.  jmp (a2)
  5250.  
  5251. DIMLONG_FP_
  5252.  move.l (sp)+,a2
  5253.  move.l (sp)+,a0
  5254.  moveq #2,d7
  5255.  bsr DimField
  5256.  move.l FirstLocalField(a5),FIELD_NEXT(a0)
  5257.  move.l a0,FirstLocalField(a5)
  5258.  jmp (a2)
  5259.  
  5260. DIMREAL_FP_
  5261.  move.l (sp)+,a2
  5262.  move.l (sp)+,a0
  5263.  moveq #2,d7
  5264.  bsr DimField
  5265.  move.l FirstLocalField(a5),FIELD_NEXT(a0)
  5266.  move.l a0,FirstLocalField(a5)
  5267.  jmp (a2)
  5268.  
  5269. DIMTEXT_FP_
  5270.  move.l (sp)+,a2
  5271.  move.l (sp)+,a0
  5272.  moveq #2,d7
  5273.  bsr DimField
  5274.  move.l FirstLocalField(a5),FIELD_NEXT(a0)
  5275.  move.l a0,FirstLocalField(a5)
  5276.  bsr AddTextField
  5277.  move.l FIELD_MEM(a0),a1
  5278.  add.l FIELD_MEMSIZE(a0),a1
  5279.  move.l FIELD_MEM(a0),a0
  5280.  bsr ClearTextField
  5281.  jmp (a2)
  5282.  
  5283. DIMSHAREDDOUB_FP_
  5284.  move.l (sp)+,a2
  5285.  move.l (sp)+,a0
  5286.  moveq #3,d7
  5287.  bsr DimField
  5288.  move.l FirstGlobalField(a5),FIELD_NEXT(a0)
  5289.  move.l a0,FirstGlobalField(a5)
  5290.  jmp (a2)
  5291.  
  5292. DIMSHAREDINT_FP_
  5293.  move.l (sp)+,a2
  5294.  move.l (sp)+,a0
  5295.  moveq #1,d7
  5296.  bsr DimField
  5297.  move.l FirstGlobalField(a5),FIELD_NEXT(a0)
  5298.  move.l a0,FirstGlobalField(a5)
  5299.  jmp (a2)
  5300.  
  5301. DIMSHAREDLONG_FP_
  5302.  move.l (sp)+,a2
  5303.  move.l (sp)+,a0
  5304.  moveq #2,d7
  5305.  bsr DimField
  5306.  move.l FirstGlobalField(a5),FIELD_NEXT(a0)
  5307.  move.l a0,FirstGlobalField(a5)
  5308.  jmp (a2)
  5309.  
  5310. DIMSHAREDREAL_FP_
  5311.  move.l (sp)+,a2
  5312.  move.l (sp)+,a0
  5313.  moveq #2,d7
  5314.  bsr DimField
  5315.  move.l FirstGlobalField(a5),FIELD_NEXT(a0)
  5316.  move.l a0,FirstGlobalField(a5)
  5317.  jmp (a2)
  5318.  
  5319. DIMSHAREDTEXT_FP_
  5320.  move.l (sp)+,a2
  5321.  move.l (sp)+,a0
  5322.  moveq #2,d7
  5323.  bsr DimField
  5324.  move.l FirstGlobalField(a5),FIELD_NEXT(a0)
  5325.  move.l a0,FirstGlobalField(a5)
  5326.  bsr AddTextField
  5327.  move.l FIELD_MEM(a0),a1
  5328.  add.l FIELD_MEMSIZE(a0),a1
  5329.  move.l FIELD_MEM(a0),a0
  5330.  bsr ClearTextField
  5331.  jmp (a2)
  5332.  
  5333. DimField
  5334.  move.l (sp)+,d6
  5335.  tst.l FIELD_MEM(a0)
  5336.  bne ErrorDuplicateDefinition
  5337.  lea FIELD_NUMDIMS(a0),a1
  5338.  move.w (sp)+,d0
  5339.  move.w d0,(a1)+
  5340.  moveq #1,d1
  5341. DimFieldLoop
  5342.  moveq #0,d2
  5343.  move.w (sp)+,d2
  5344.  bmi ErrorIllegalFunctionCall
  5345.  addq.l #1,d2
  5346.  move.w d2,(a1)+
  5347.  move.l d1,d3
  5348.  swap d3
  5349.  mulu d2,d3
  5350.  swap d3
  5351.  tst.w d3
  5352.  bne ErrorIllegalFunctionCall
  5353.  mulu d2,d1
  5354.  add.l d3,d1
  5355.  bvs ErrorIllegalFunctionCall
  5356.  dbra d0,DimFieldLoop
  5357.  lsl.l d7,d1
  5358.  move.l d1,FIELD_MEMSIZE(a0)
  5359.  move.l d1,d0
  5360.  moveq #0,d1
  5361.  bsr MyAllocMem
  5362.  move.l d0,FIELD_MEM(a0)
  5363.  move.l d6,-(sp)
  5364.  rts
  5365.  
  5366. GETDOUBELEM_FP_D
  5367.  move.l (sp)+,a2
  5368.  moveq #3,d7
  5369.  bsr GetElemPointer
  5370.  move.l (a0)+,d0
  5371.  move.l (a0),-(sp)
  5372.  move.l d0,-(sp)
  5373.  jmp (a2)
  5374.  
  5375. GETINTELEM_FP_I
  5376.  move.l (sp)+,a2
  5377.  moveq #1,d7
  5378.  bsr GetElemPointer
  5379.  move.w (a0),-(sp)
  5380.  jmp (a2)
  5381.  
  5382. GETLONGELEM_FP_L
  5383.  move.l (sp)+,a2
  5384.  moveq #2,d7
  5385.  bsr GetElemPointer
  5386.  move.l (a0),-(sp)
  5387.  jmp (a2)
  5388.  
  5389. GETREALELEM_FP_R
  5390.  move.l (sp)+,a2
  5391.  moveq #2,d7
  5392.  bsr GetElemPointer
  5393.  move.l (a0),-(sp)
  5394.  jmp (a2)
  5395.  
  5396. GETTEXTELEM_FP_T
  5397.  move.l (sp)+,a2
  5398.  moveq #2,d7
  5399.  bsr GetElemPointer
  5400.  move.l a0,-(sp)
  5401.  jmp (a2)
  5402.  
  5403. GETDOUBELEMPOINTER_FP_L
  5404.  move.l (sp)+,a2
  5405.  moveq #3,d7
  5406.  bsr GetElemPointer
  5407.  move.l a0,-(sp)
  5408.  jmp (a2)
  5409.  
  5410. GETINTELEMPOINTER_FP_L
  5411.  move.l (sp)+,a2
  5412.  moveq #1,d7
  5413.  bsr GetElemPointer
  5414.  move.l a0,-(sp)
  5415.  jmp (a2)
  5416.  
  5417. GETLONGELEMPOINTER_FP_L
  5418.  move.l (sp)+,a2
  5419.  moveq #2,d7
  5420.  bsr GetElemPointer
  5421.  move.l a0,-(sp)
  5422.  jmp (a2)
  5423.  
  5424. GETREALELEMPOINTER_FP_L
  5425.  move.l (sp)+,a2
  5426.  moveq #2,d7
  5427.  bsr GetElemPointer
  5428.  move.l a0,-(sp)
  5429.  jmp (a2)
  5430.  
  5431. GETTEXTELEMPOINTER_FP_L
  5432.  move.l (sp)+,a2
  5433.  moveq #2,d7
  5434.  bsr GetElemPointer
  5435.  move.l a0,-(sp)
  5436.  jmp (a2)
  5437.  
  5438. SETDOUBELEM_DFP_
  5439.  move.l (sp)+,a2
  5440.  moveq #3,d7
  5441.  bsr GetElemPointer
  5442.  move.l (sp)+,(a0)+
  5443.  move.l (sp)+,(a0)
  5444.  jmp (a2)
  5445.  
  5446. SETINTELEM_IFP_
  5447.  move.l (sp)+,a2
  5448.  moveq #1,d7
  5449.  bsr GetElemPointer
  5450.  move.w (sp)+,(a0)
  5451.  jmp (a2)
  5452.  
  5453. SETLONGELEM_LFP_
  5454.  move.l (sp)+,a2
  5455.  moveq #2,d7
  5456.  bsr GetElemPointer
  5457.  move.l (sp)+,(a0)
  5458.  jmp (a2)
  5459.  
  5460. SETREALELEM_RFP_
  5461.  move.l (sp)+,a2
  5462.  moveq #2,d7
  5463.  bsr GetElemPointer
  5464.  move.l (sp)+,(a0)
  5465.  jmp (a2)
  5466.  
  5467. SETTEXTELEM_TFP_
  5468.  move.l (sp)+,a2
  5469.  moveq #2,d7
  5470.  bsr GetElemPointer
  5471.  move.l (sp)+,a1
  5472.  move.l (a1),(a0)
  5473.  jmp (a2)
  5474.  
  5475. ; a2 darf nicht verändert werden, das Ergebnis steht in a0 (Zeiger auf Elem)
  5476. GetElemPointer
  5477.  move.l (sp)+,d6
  5478.  move.l (sp)+,a0
  5479.  tst.l FIELD_MEM(a0)
  5480.  beq ErrorSubscriptOutOfRange
  5481.  move.w (sp)+,d1
  5482.  cmp.w FIELD_NUMDIMS(a0),d1
  5483.  bne ErrorSubscriptOutOfRange
  5484.  lea FIELD_FIRSTDIM(a0),a1
  5485.  moveq #0,d0       ; Elementnummer
  5486. GetElemNumLoop
  5487.  move.w (a1)+,d3   ; Faktor holen
  5488.  move.l d0,d4
  5489.  swap d4
  5490.  mulu d3,d4
  5491.  swap d4
  5492.  mulu d3,d0
  5493.  add.l d4,d0
  5494.  moveq #0,d2
  5495.  move.w (sp)+,d2
  5496.  cmp.w d3,d2
  5497.  bcc ErrorSubscriptOutOfRange
  5498.  add.l d2,d0
  5499.  dbra d1,GetElemNumLoop
  5500.  lsl.l d7,d0
  5501.  move.l FIELD_MEM(a0),a0
  5502.  add.l d0,a0
  5503.  move.l d6,-(sp)
  5504.  rts
  5505.  
  5506. ; **********************************************************************
  5507. ; *                                                                    *
  5508. ; * Fehlerbehandlung                                                   *
  5509. ; *                                                                    *
  5510. ; **********************************************************************
  5511.  
  5512. ;
  5513. ; Darf sich nur auf die Libraries verlassen!
  5514. ;
  5515.  
  5516. Error
  5517.  
  5518.  Break_Off
  5519.  
  5520.  move.b #-1,ErrorOccured(a5)
  5521.  
  5522. ; Text für den Fehler suchen
  5523.  lea ErrorTable,a2
  5524. FindingLoop
  5525.  move.b (a2)+,d1
  5526.  bmi.s EndOfTableReached
  5527.  cmp.b d1,d0
  5528.  beq.s FoundErrorText
  5529. FindEndOfErrorText
  5530.  tst.b (a2)+
  5531.  bne.s FindEndOfErrorText
  5532.  bra.s FindingLoop
  5533. FoundErrorText
  5534. EndOfTableReached
  5535.  
  5536.  CallDOS Output
  5537.  move.l d0,d7
  5538.  ble NoStdOutPut
  5539.  
  5540.  move.l d7,d1
  5541.  move.l #ErrorText1,d2
  5542.  moveq #ErrorText1End-ErrorText1,d3
  5543.  CallDOS Write
  5544.  
  5545.  move.l d7,d1
  5546.  move.l a2,d2
  5547. FindEndLoop
  5548.  tst.b (a2)+
  5549.  bne.s FindEndLoop
  5550.  move.l a2,d3
  5551.  sub.l d2,d3
  5552.  subq.l #1,d3
  5553.  CallDOS Write
  5554.  
  5555.  tst.l ThisSourceLine(a5)
  5556.  beq NoSourceLineSet
  5557.  
  5558.  move.l d7,d1
  5559.  move.l #ErrorLineText1,d2
  5560.  moveq #ErrorLineText1End-ErrorLineText1,d3
  5561.  CallDOS Write
  5562.  
  5563.  lea ErrorLongVarString,a0
  5564.  lea ThisSourceLine(a5),a1
  5565.  lea RawDoFmtProc,a2
  5566.  lea ErrorLongBuffer(a5),a3
  5567.  CallSys RawDoFmt
  5568.  
  5569.  move.l d7,d1
  5570.  lea ErrorLongBuffer(a5),a0
  5571.  move.l a0,d2
  5572. FindErrorLineEndLoop
  5573.  tst.b (a0)+
  5574.  bne.s FindErrorLineEndLoop
  5575.  move.l a0,d3
  5576.  sub.l d2,d3
  5577.  subq.l #1,d3
  5578.  CallDOS Write
  5579.  
  5580.  move.l d7,d1
  5581.  move.l #ErrorLineText2,d2
  5582.  moveq #ErrorLineText2End-ErrorLineText2,d3
  5583.  CallDOS Write
  5584.  
  5585. NoSourceLineSet
  5586.  
  5587.  move.l d7,d1
  5588.  move.l #ErrorText2,d2
  5589.  moveq #ErrorText2End-ErrorText2,d3
  5590.  CallDOS Write
  5591.  
  5592.  bra END___NoCheck
  5593.  
  5594. ErrorText1 dc.b 13,'Basic-Error: '
  5595. ErrorText1End
  5596.  
  5597. ErrorLineText1 dc.b ' (Line '
  5598. ErrorLineText1End
  5599.  
  5600. ErrorLineText2 dc.b ')'
  5601. ErrorLineText2End
  5602.  
  5603. ErrorText2 dc.b 10
  5604. ErrorText2End
  5605.  
  5606. ErrorLongVarString dc.b '%ld',0
  5607.  
  5608.  even
  5609.  
  5610. NoStdOutPut
  5611.  lea IntuiText(a5),a0
  5612.  clr.b (a0)+
  5613.  move.b #1,(a0)+
  5614.  move.b #1,(a0)+
  5615.  clr.b (a0)+
  5616.  move.w #10,(a0)+
  5617.  move.w #10,(a0)+
  5618.  clr.l (a0)+
  5619.  move.l a2,(a0)+
  5620.  clr.l (a0)
  5621.  sub.l a0,a0
  5622.  lea IntuiText(a5),a1
  5623.  sub.l a2,a2
  5624.  lea ContinueIntuiText,a3
  5625.  moveq #0,d0
  5626.  moveq #0,d1
  5627.  move.l #400,d2
  5628.  moveq #60,d3
  5629.  CallIntuition AutoRequest
  5630.  bra END___NoCheck
  5631.  
  5632. ContinueIntuiText
  5633.  dc.b 0,1,1,0
  5634.  dc.w 5,3
  5635.  dc.l 0,PositiveText,0
  5636. PositiveText
  5637.  dc.b " Continue",0
  5638.  even
  5639.  
  5640. ; Fehlertabelle
  5641. ErrorTable
  5642.  dc.b 03,'RETURN without GOSUB',0
  5643.  dc.b 04,'Out of data',0
  5644.  dc.b 05,'Illegal function call',0
  5645.  dc.b 06,'Overflow',0
  5646.  dc.b 07,'Out of memory',0
  5647.  dc.b 09,'Subscript out of range',0
  5648.  dc.b 10,'Duplicate definition',0
  5649.  dc.b 11,'Division by zero',0
  5650.  dc.b 14,'Out of heap space',0
  5651.  dc.b 15,'String too long',0
  5652.  dc.b 19,'No RESUME',0
  5653.  dc.b 20,'RESUME without error',0
  5654.  dc.b 23,'Line buffer overflow',0
  5655.  dc.b 50,'FIELD overflow',0
  5656.  dc.b 52,'Bad file number',0
  5657.  dc.b 53,'File not found',0
  5658.  dc.b 54,'Bad file mode',0
  5659.  dc.b 55,'File already open',0
  5660.  dc.b 57,'Device I/O error',0
  5661.  dc.b 58,'File already exists',0
  5662.  dc.b 61,'Disk full',0
  5663.  dc.b 62,'Input past end',0
  5664.  dc.b 63,'Bad record number',0
  5665.  dc.b 64,'Bad file name',0
  5666.  dc.b 68,'Device unavailable',0
  5667.  dc.b 70,'Permission denied',0
  5668.  dc.b 73,'Advanced feature',0
  5669.  dc.b 74,'Unknown Volume',0
  5670.  dc.b 100,'Cannot open Window',0
  5671.  dc.b 101,'Stack overflow',0
  5672.  dc.b 102,'Internal Error: FreeMem',0
  5673.  dc.b 103,'Could not open Console',0
  5674.  dc.b 104,'No math.library',0
  5675.  dc.b 105,'No mathtrans.library',0
  5676.  dc.b 106,'No mathieeedoubbas.library',0
  5677.  dc.b 107,'No mathieeedoubtrans.library',0
  5678.  dc.b 108,'Garbagecollection out of Memory',0
  5679.  dc.b 109,'I/O error',0
  5680.  dc.b 110,'File is not a directory',0
  5681.  dc.b 111,'Internal error: stack trashed',0
  5682.  dc.b 112,'Could not alloc trap 7',0
  5683.  dc.b -1,"Unprintable error",0
  5684.  even
  5685.  
  5686. ErrorReturnWithoutGosub
  5687.  moveq #3,d0
  5688.  bra Error
  5689. ErrorOutOfData
  5690.  moveq #4,d0
  5691.  bra Error
  5692. ErrorIllegalFunctionCall
  5693.  moveq #5,d0
  5694.  bra Error
  5695. ErrorOverflow
  5696.  moveq #6,d0
  5697.  bra Error
  5698. ErrorOutOfMemory
  5699.  moveq #7,d0
  5700.  bra Error
  5701. ErrorSubscriptOutOfRange
  5702.  moveq #9,d0
  5703.  bra Error
  5704. ErrorDuplicateDefinition
  5705.  moveq #10,d0
  5706.  bra Error
  5707. ErrorDivisionByZero
  5708.  moveq #11,d0
  5709.  bra Error
  5710. ErrorOutOfHeapSpace
  5711.  moveq #14,d0
  5712.  bra Error
  5713. ErrorStringTooLong
  5714.  moveq #15,d0
  5715.  bra Error
  5716. ErrorNoResume
  5717.  moveq #19,d0
  5718.  bra Error
  5719. ErrorResumeWithoutError
  5720.  moveq #20,d0
  5721.  bra Error
  5722. ErrorLineBufferOverflow
  5723.  moveq #23,d0
  5724.  bra Error
  5725. ErrorFieldOverflow
  5726.  moveq #50,d0
  5727.  bra Error
  5728. ErrorBadFileNumber
  5729.  moveq #52,d0
  5730.  bra Error
  5731. ErrorFileNotFound
  5732.  moveq #53,d0
  5733.  bra Error
  5734. ErrorBadFileMode
  5735.  moveq #54,d0
  5736.  bra Error
  5737. ErrorFileAlreadyOpen
  5738.  moveq #55,d0
  5739.  bra Error
  5740. ErrorDeviceIoError
  5741.  moveq #57,d0
  5742.  bra Error
  5743. ErrorFileAlreadyExists
  5744.  moveq #58,d0
  5745.  bra Error
  5746. ErrorDiskFull
  5747.  moveq #61,d0
  5748.  bra Error
  5749. ErrorInputPastEnd
  5750.  moveq #62,d0
  5751.  bra Error
  5752. ErrorBadRecordNumber
  5753.  moveq #63,d0
  5754.  bra Error
  5755. ErrorBadFileName
  5756.  moveq #64,d0
  5757.  bra Error
  5758. ErrorDeviceUnavailable
  5759.  moveq #68,d0
  5760.  bra Error
  5761. ErrorPermissionDenied
  5762.  moveq #70,d0
  5763.  bra Error
  5764. ErrorAdvancedFeature
  5765.  moveq #73,d0
  5766.  bra Error
  5767. ErrorUnknownVolume
  5768.  moveq #74,d0
  5769.  bra Error
  5770. ErrorCannotOpenWindow
  5771.  moveq #100,d0
  5772.  bra Error
  5773. ErrorStackOverflow
  5774.  moveq #101,d0
  5775.  bra Error
  5776. ErrorFreeMem
  5777.  moveq #102,d0
  5778.  bra Error
  5779. ErrorCouldNotOpenConsole
  5780.  moveq #103,d0
  5781.  bra Error
  5782. ErrorNoMathLibrary
  5783.  moveq #104,d0
  5784.  bra Error
  5785. ErrorNoMathTransLibrary
  5786.  moveq #105,d0
  5787.  bra Error
  5788. ErrorNoMathIeeeDoubBasLibrary
  5789.  moveq #106,d0
  5790.  bra Error
  5791. ErrorNoMathIeeeDoubTransLibrary
  5792.  moveq #107,d0
  5793.  bra Error
  5794. ErrorGarbageCollectionOutOfMemory
  5795.  moveq #108,d0
  5796.  bra Error
  5797. ErrorIO
  5798.  moveq #109,d0
  5799.  bra Error
  5800. ErrorNoDirectory
  5801.  moveq #110,d0
  5802.  bra Error
  5803. ErrorStackTrashed
  5804.  moveq #111,d0
  5805.  bra Error
  5806. ErrorNoTrapSeven
  5807.  moveq #112,d0
  5808.  bra Error
  5809.  
  5810. ; Tabelle der Ein-/Ausgabefehler
  5811. IOErrorTable:
  5812.  dc.b 103,'NO FREE STORE',0
  5813.  dc.b 105,'TASK TABLE FULL',0
  5814.  dc.b 120,'LINE TOO LONG',0
  5815.  dc.b 121,'FILE NOT OBJECT',0
  5816.  dc.b 122,'INVALID RESIDENT LIBRARY',0
  5817.  dc.b 201,'NO DEFAULT DIR',0
  5818.  dc.b 202,'OBJECT IN USE',0
  5819.  dc.b 203,'OBJECT EXISTS',0
  5820.  dc.b 204,'DIR NOT FOUND',0
  5821.  dc.b 205,'OJBECT NOT FOUND',0
  5822.  dc.b 206,'BAD STREAM NAME',0
  5823.  dc.b 207,'OBJECT TOO LARGE',0
  5824.  dc.b 209,'ACTION NOT KNOWN',0
  5825.  dc.b 210,'INVALID COMPONENT NAME',0
  5826.  dc.b 211,'INVALID LOCK',0
  5827.  dc.b 212,'OBJECT WRONG TYPE',0
  5828.  dc.b 213,'DISK NOT VALIDATED',0
  5829.  dc.b 214,'DISK WRITE PROTECTED',0
  5830.  dc.b 215,'RENAME ACROSS DEVICES',0
  5831.  dc.b 216,'DIRECTORY NOT EMPTY',0
  5832.  dc.b 217,'TOO MANY LEVELS',0
  5833.  dc.b 218,'DEVICE NOT MOUNTED',0
  5834.  dc.b 219,'SEEK ERROR',0
  5835.  dc.b 220,'COMMENT TOO BIG',0
  5836.  dc.b 221,'DISK FULL',0
  5837.  dc.b 222,'DELETE PROTECTED',0
  5838.  dc.b 223,'WRITE PROTECTED',0
  5839.  dc.b 224,'READ PROTECTED',0
  5840.  dc.b 225,'NOT A DOS DISK',0
  5841.  dc.b 226,'NO DISK',0
  5842.  dc.b 232,'NO MORE ENTRIES',0
  5843.  dc.b -1
  5844.  
  5845. ; **********************************************************************
  5846. ; *                                                                    *
  5847. ; * Stringunterstützung                                                *
  5848. ; *                                                                    *
  5849. ; **********************************************************************
  5850.  
  5851. ; Um einen String zu erzeugen muß CreateString aufgerufen werden.
  5852. ; In A3.w steht zunächst die größtmögliche Länge des Strings oder die
  5853. ; genau Länge (wird zum Test auf Garbage-Collection benutzt)
  5854. ; A3 zeigt dann auf einen Zeiger auf die Länge des neuen Strings.
  5855. ; Auf jedes CreateString muß ein FinishStringCGarbage folgen!
  5856.  
  5857. CreateString
  5858.  movem.l d0/d1/a0,-(sp)
  5859. ; Auf Garbage-Collection testen
  5860.  move.w a3,d0
  5861.  bmi ErrorStringTooLong
  5862.  ext.l d0
  5863.  addq.l #8,d0
  5864.  bclr #0,d0
  5865.  add.l FreeStringPointer(a5),d0
  5866.  move.l StringsMem(a5),d1
  5867.  add.l StringsMemSize(a5),d1
  5868.  cmp.l d1,d0
  5869.  blt.s NoNeedGarbageCollection
  5870.  sub.l FreeStringPointer(a5),d0
  5871.  movem.l d0-a3,-(sp)
  5872.  bsr DoGarbageCollection
  5873.  movem.l (sp)+,d0-a3
  5874.  add.l FreeStringPointer(a5),d0
  5875.  cmp.l d1,d0
  5876.  bge ErrorGarbageCollectionOutOfMemory
  5877. NoNeedGarbageCollection
  5878. ; Neuen String besorgen
  5879.  move.l FreeStringPointer(a5),a3
  5880.  clr.l (a3)+
  5881.  move.w TempNumber(a5),d0
  5882.  lsl.w #2,d0
  5883.  lea TempMem(a5,d0.w),a0
  5884.  move.l a3,(a0)
  5885.  move.l a0,a3
  5886.  move.w TempNumber(a5),d0
  5887.  addq.w #1,d0
  5888.  cmp.w #MAXTEMP,d0
  5889.  bne.s NotLastPosReached
  5890.  moveq #0,d0
  5891. NotLastPosReached
  5892.  move.w d0,TempNumber(a5)
  5893.  movem.l (sp)+,d0/d1/a0
  5894.  rts
  5895.  
  5896. ; FinishString geht davon aus, daß FreeStringPointer(a5) noch erhöht werden
  5897. ; muß. Beim Aufruf von FinishString zeigt er auf das Longword vor der Länge
  5898. ; des neu hinzugefügten Strings. Es wird ein Nullbyte hinten an den String
  5899. ; angefügt (für C-Strings).
  5900. ; Auf jedes CreateString muß ein FinishString folgen!
  5901.  
  5902. FinishString
  5903.  movem.l d0/a0,-(sp)
  5904. ; alten String fertig machen
  5905.  move.l FreeStringPointer(a5),a0
  5906.  addq.l #4,a0
  5907.  add.w (a0)+,a0
  5908.  clr.b (a0)+
  5909.  move.l a0,d0
  5910.  addq.l #1,d0
  5911.  bclr #0,d0
  5912.  move.l d0,FreeStringPointer(a5)
  5913.  movem.l (sp)+,d0/a0
  5914.  rts
  5915.  
  5916. ; **********************************************************************
  5917. ; *                                                                    *
  5918. ; * Garbage-Collection ausführen                                       *
  5919. ; *                                                                    *
  5920. ; **********************************************************************
  5921.  
  5922. DoGarbageCollection
  5923. ; Grenzen des Speichers für Strings
  5924.  move.l StringsMem(a5),d4
  5925.  move.l d4,d5
  5926.  add.l StringsMemSize(a5),d5
  5927.  
  5928. ; Pass1
  5929. ; Markieren der noch benötigten Strings
  5930.  lea TempField(a5),a0
  5931. Pass1_NextTextField
  5932.  move.l FIELD_MEM(a0),a1
  5933.  move.l FIELD_MEMSIZE(a0),d0
  5934.  bra.s Pass1_EnterLoop
  5935. Pass1_Loop
  5936.  move.l (a1)+,a2
  5937.  tst.w (a2)
  5938.  beq.s Pass1_StringEmpty
  5939.  cmp.l d4,a2
  5940.  blt.s Pass1_NotInStringsMem
  5941.  cmp.l d5,a2
  5942.  bgt.s Pass1_NotInStringsMem
  5943.  move.w #1,-(a2)             ; Diesen String markieren
  5944. Pass1_NotInStringsMem
  5945. Pass1_StringEmpty
  5946. Pass1_EnterLoop
  5947.  subq.l #4,d0
  5948.  bpl.s Pass1_Loop
  5949.  move.l FIELD_TEXTSUCC(a0),a0
  5950.  move.l a0,d0
  5951.  bne.s Pass1_NextTextField
  5952.  
  5953. ; Pass2
  5954. ; Errechnen der neuen Stellen der Strings
  5955.  move.l StringsMem(a5),a0
  5956.  addq.l #4,a0                          ; a0: Zeiger auf alte Position
  5957.  move.l a0,a1                          ; a1: Zeiger auf die neue Position
  5958. Pass2_NotReady
  5959.  move.w (a0),d0                        ; d0: Offset zum nächsten String
  5960.  addq.w #8,d0
  5961.  bclr #0,d0
  5962.  tst.w -2(a0)                          ; Ist dieser markiert?
  5963.  beq.s Pass2_StringNotNeeded
  5964.  move.l a1,-4(a0)                      ; Neue Position eintragen
  5965.  add.w d0,a1                           ; auch neuen Zeiger erhöhen
  5966. Pass2_StringNotNeeded
  5967.  add.w d0,a0                           ; zum nächsten String
  5968.  cmp.l FreeStringPointer(a5),a0
  5969.  blt.s Pass2_NotReady
  5970.  
  5971. ; Pass3
  5972. ; Ändern der Zeiger der String-Variablen
  5973.  lea TempField(a5),a0
  5974. Pass3_NextTextField
  5975.  move.l FIELD_MEM(a0),a1
  5976.  move.l FIELD_MEMSIZE(a0),d0
  5977.  bra.s Pass3_EnterLoop
  5978. Pass3_Loop
  5979.  move.l (a1),a2
  5980.  tst.w (a2)
  5981.  beq.s Pass3_StringEmpty
  5982.  cmp.l d4,a2
  5983.  blt.s Pass3_NotInStringsMem
  5984.  cmp.l d5,a2
  5985.  bgt.s Pass3_NotInStringsMem
  5986.  move.l -4(a2),(a1)
  5987.  bra.s Pass3_StringNotEmpty
  5988. Pass3_StringEmpty
  5989.  lea NullWord,a2
  5990.  move.l a2,(a1)
  5991. Pass3_StringNotEmpty
  5992. Pass3_NotInStringsMem
  5993.  addq.l #4,a1
  5994. Pass3_EnterLoop
  5995.  subq.l #4,d0
  5996.  bpl.s Pass3_Loop
  5997.  move.l FIELD_TEXTSUCC(a0),a0
  5998.  move.l a0,d0
  5999.  bne.s Pass3_NextTextField
  6000.  
  6001. ; Pass4
  6002. ; Zusammenkopieren der Strings
  6003.  move.l StringsMem(a5),a1       ; Zeiger auf das Ziel der Strings
  6004.  lea 4(a1),a0                   ; Zeiger zum Auslesen der alten Strings
  6005. Pass4_Loop
  6006.  cmp.l FreeStringPointer(a5),a0
  6007.  bge.s Pass4_Ready
  6008.  move.w (a0)+,d0
  6009.  tst.l -6(a0)
  6010.  beq.s Pass4_SkipThisString
  6011.  clr.l (a1)+
  6012.  move.w d0,(a1)+
  6013.  lsr.w #1,d0
  6014. Pass4_WordCopyLoop
  6015.  move.w (a0)+,(a1)+
  6016.  dbra d0,Pass4_WordCopyLoop
  6017.  addq.l #4,a0
  6018.  bra.s Pass4_Loop
  6019. Pass4_SkipThisString
  6020.  addq.w #6,d0
  6021.  bclr #0,d0
  6022.  add.w d0,a0
  6023.  bra.s Pass4_Loop
  6024. Pass4_Ready
  6025.  move.l a1,FreeStringPointer(a5)
  6026.  
  6027.  rts
  6028.  
  6029.  END
  6030.  
  6031.